Là eval $ (tên tệp mèo) giống như tên tệp nguồn?


9

Làm việc trên một số hàm bash, tôi không biết source ...lệnh, vì vậy tôi đã sử dụng eval $(cat ...)thay thế. Bây giờ tôi tự hỏi, tôi nên thay đổi mỗi lần sử dụng đó, hay nó chỉ là cùng một chức năng?

Họ dường như làm việc như bây giờ, nhưng có lẽ sẽ có một số khác biệt sai lệch sau này, tôi chỉ muốn biết.

Câu trả lời:


6

eval $(cat ...)không hoạt động trong mọi trường hợp. Ví dụ, ngắt dòng được chuyển đổi thành một khoảng trắng $(cat ...)trước khi nội dung được xử lý bởi eval. Điều này thường phá vỡ các câu lệnh nhiều dòng như các vòng lặp và các tài liệu ở đây.

Ví dụ: thử tập tin sau với cả hai phương pháp:

for i in 1 2 3; do
 echo $i
done

cat<<EOF
a
b
c
EOF

4
Nếu bạn sử dụng dấu ngoặc kép, khoảng trắng sẽ được giữ nguyên:eval "$(cat file)"
glenn jackman

1
Vâng, điều đó cũng nên làm việc. Nhưng nếu ai đó phải thay đổi mã thì dù sao tôi cũng thích sourcevì đó là một lệnh được tạo riêng cho việc này.
Florian Diesch

9

Như đã được đề cập bởi @glennjackman, bạn sẽ muốn trích dẫn thay thế lệnh, việc tách từ khác và mở rộng tên đường dẫn sẽ sửa đổi nội dung trước khi bị loại bỏ. Và trong khi cả hai sẽ thực hiện các lệnh từ tệp, có sự khác biệt.

  • Khi bạn nguồn một kịch bản, nhiều biến vỏ đặc biệt sẽ được sửa đổi, chủ yếu là BASH_SOURCE, BASH_LINENOFUNCNAMEmảng. Đây là hữu ích để in thông báo lỗi và gỡ lỗi.

  • Bạn có thể trở về từ một tập lệnh có nguồn gốc bằng returnlệnh ( help return). Với eval, bạn sẽ không có được hiệu ứng đó. Và tương tự, một cái bẫy TRẢ LẠI sẽ không được kích hoạt cho eval.

  • Khi tìm nguồn cung cấp một tập lệnh, bạn có thể truyền các đối số cho nó. Bạn không thể làm điều đó với eval đó.

  • Với eval, lệnh thay thế sẽ đọc toàn bộ nội dung của tệp vào bộ nhớ trước khi chuyển nó sang eval. Khi bạn lấy nó, bash sẽ đọc từ tệp khi nó đi.


1

Có một bản tóm tắt hay về nguồn, eval và exec làm gì ở đây: http://www.unix.com/shell-programming-scripting/54347-bash-shell-exec-eval-source-looking-help-understand.html

Tôi nghĩ rằng việc bạn sử dụng eval và nguồn của tập tin sẽ làm điều tương tự. Tuy nhiên, tôi không hoàn toàn chắc chắn rằng các biến trong chỉ mục sẽ hoạt động giống nhau trong mọi trường hợp. Tôi khuyên bạn nên sử dụng nguồn nếu có thể, bởi vì đó là cách đơn giản hơn để đi và làm cho mã của bạn dễ đọc hơn.


3
tiếp tuyến hoàn hảo: bash có một tốc ký cho $(cat file)->$(< file)
glenn jackman
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.