- Sự khác biệt giữa các cách là gì?
từ bash manpage
:
eval [arg ...]
The args are read and concatenated together into a single com‐
mand. This command is then read and executed by the shell, and
its exit status is returned as the value of eval. If there are
no args, or only null arguments, eval returns 0.
source filename [arguments]
Read and execute commands from filename in the current shell
environment and return the exit status of the last command exe‐
cuted from filename. If filename does not contain a slash, file
names in PATH are used to find the directory containing file‐
name. The file searched for in PATH need not be executable.
When bash is not in posix mode, the current directory is
searched if no file is found in PATH. If the sourcepath option
to the shopt builtin command is turned off, the PATH is not
searched. If any arguments are supplied, they become the posi‐
tional parameters when filename is executed. Otherwise the
positional parameters are unchanged. The return status is the
status of the last command exited within the script (0 if no
commands are executed), and false if filename is not found or
cannot be read.
Không có sự khác biệt giữa hai cách.
Chỉ có một lưu ý: eval
nối tất cả các đối số của nó, sau đó được chạy dưới dạng một lệnh duy nhất. source
đọc nội dung của tập tin và thực thi chúng eval
Chỉ có thể xây dựng các lệnh từ các đối số của nó, không stdin
. Vì vậy, bạn không thể làm như thế này:
printf "ls" | eval
- Cái nào được ưa thích hơn?
Ví dụ của bạn cung cấp cùng một kết quả, nhưng mục đích eval
và source
khác nhau. source
thường được sử dụng để cung cấp một thư viện cho các tập lệnh khác, trong khi eval
chỉ được sử dụng để đánh giá các lệnh. Bạn nên tránh sử dụng eval
nếu có thể, bởi vì không có gì đảm bảo rằng chuỗi bị loại bỏ là sạch; chúng ta phải làm một số kiểm tra vệ sinh, sử dụng subshell
thay thế.
- Nếu chúng ta chạy một số lệnh trong () hoặc {}, cái nào được ưa thích hơn?
Khi bạn chạy các lệnh tuần tự bên trong dấu ngoặc nhọn { }
, tất cả các lệnh được chạy trong trình bao hiện tại , thay vì một lớp con (đó là trường hợp nếu bạn chạy bên trong dấu ngoặc đơn (xem tham chiếu bash )).
Sử subshell ( )
dụng sử dụng nhiều tài nguyên hơn, nhưng môi trường hiện tại của bạn không bị ảnh hưởng. Sử dụng { }
chạy tất cả các lệnh trong shell hiện tại, vì vậy môi trường của bạn bị ảnh hưởng. Tùy thuộc vào mục đích của bạn, bạn có thể chọn một trong số họ.