Bí danh mới không có sẵn sau;


9

Cho đến bây giờ tôi nghĩ rằng một dấu chấm phẩy trong vỏ có (bằng cách nào đó) có ý nghĩa tương tự như ngắt dòng. Vì vậy, tôi đã ngạc nhiên rằng

alias <name>=<replacement text>; <name>

<name>không biết trong khi nó được biết đến trong dòng tiếp theo. csh, tcsh, sh, kshbashcư xử như vậy. Ít nhất đối với cshnó không quan trọng nếu bí danh được sử dụng trực tiếp hoặc nếu tập lệnh có nguồn gốc trước semccolon - các bí danh không được biết sau ;nhưng được biết đến trong dòng lệnh tiếp theo. Đây có phải là một lỗi hoặc hành vi này là dự định?


"Tôi nghĩ rằng một dấu chấm phẩy trong vỏ có (bằng cách nào đó) có ý nghĩa tương tự như ngắt dòng" Gần như vậy. Không hẳn!
Các cuộc đua nhẹ nhàng trong quỹ đạo

1
Việc giải thích dấu chấm phẩy và dòng mới phụ thuộc vào cách gọi trình phân tích cú pháp. Đối với lệnh "dot", Bourne Shell gọi trình phân tích cú pháp bằng "NLFLG" để yêu cầu nó xử lý dòng mới và dấu chấm phẩy bằng nhau trong một số trường hợp, nhưng đây không phải là trường hợp khác. Nói chung, dấu chấm phẩy và ngắt dòng không tương đương vì bạn có thể có dấu ngắt dòng, trong đó dấu chấm phẩy sẽ gây ra lỗi cú pháp.
schily

Câu trả lời:


9

Cú pháp bí danh bạn đang sử dụng không phù hợp với trình bao POSIX, đối với trình bao POSIX, bạn cần sử dụng:

alias name='replacement'

Nhưng đối với tất cả các shell, điều này không thể hoạt động vì việc thay thế bí danh được thực hiện sớm trong trình phân tích cú pháp.

Trước khi thiết lập bí danh của bạn được thực thi, toàn bộ dòng đã được trình phân tích cú pháp đọc và vì lý do này, dòng lệnh của bạn sẽ không hoạt động.

Nếu bí danh xuất hiện trên dòng lệnh tiếp theo, nó sẽ hoạt động.


Ngoài ra, một số shell thích yashhoặc zshkhông mở rộng bí danh shell -c 'alias name=replacement<newline>replacement'. Đối với AT & T ksh, bạn sẽ gặp vấn đề với các tập lệnh có nguồn gốc .
Stéphane Chazelas

Tôi cần sử dụng csh trong trường hợp này - không có cú pháp nào =được sử dụng alias.
dùng3224237

@ user3224237 - điều này không liên quan gì đến =. đó là bởi vì việc mở rộng bí danh xảy ra khi shell lần đầu tiên nhìn thấy dòng, đó là trước khi bạn xác định bí danh.
cas

@ Stéphane Chazelas Hành vi với các tập lệnh "có nguồn gốc" là do thực tế là trình bao Bourne phân tích hoàn toàn các tệp như vậy trước khi chúng được thực thi. Ksh dựa trên nguồn Bourne Shell và mọi thứ không thay đổi đều hoạt động giống nhau.
schily

@schily, vâng, đó là lý do tương tự cho zsh/yash -c 'code'nơi codeđược phân tách như một toàn thể. Nó dường như không phải là trường hợp của vỏ Bourne. Vì vậy, tôi cho rằng shell Bourne phân tích cú pháp codecó một dòng tại một thời điểm.
Stéphane Chazelas

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.