Tôi chạy đoạn script sau:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Nhưng tôi nhận được:
# ./test.sh
Hello
Làm cách nào tôi có thể gửi biến VAR
tập lệnh của mình tới trình bao được tạo bằng sh -c '...'
?
Tôi chạy đoạn script sau:
VAR="Test"
sh -c 'echo "Hello $VAR"'
Nhưng tôi nhận được:
# ./test.sh
Hello
Làm cách nào tôi có thể gửi biến VAR
tập lệnh của mình tới trình bao được tạo bằng sh -c '...'
?
Câu trả lời:
Hoặc sử dụng export
để biến nó thành một biến môi trường hoặc truyền trực tiếp vào lệnh.
VAR="Test" sh -c 'echo "Hello $VAR"'
VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'
Tránh sử dụng dấu ngoặc kép xung quanh mã shell để cho phép nội suy vì điều đó đưa ra các lỗ hổng tiêm lệnh như trong:
sh -c "echo 'Xin chào $ VAR'"
gây ra khởi động lại nếu được gọi khi $VAR
chứa một cái gì đó như';reboot #
export var="Test"
trong một dòng.
Đây là một cách khác để truyền biến cho sh -c
(dưới dạng đối số vị trí):
{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}
$@
làm việc như mong đợi, ví dụ. sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"
`
$0
được hiển thị trong thông báo lỗi / cảnh báo bằng shell.
Nếu bạn không muốn xuất chúng dưới dạng các biến môi trường, đây là một mẹo bạn có thể làm. Lưu định nghĩa dao động của bạn vào một tệp .var_init.sh
và nguồn nó trong vỏ phụ của bạn như thế này:
.var_init.sh
VAR="Test"
từ dòng lệnh:
sh -c ". .var_init.sh && echo \$VAR" # Make sure to properly escape the '$'
Bằng cách này, bạn chỉ đặt các biến của mình khi thực hiện lớp con.
ENV=.var_ini.sh sh -c '...'
.var_init.sh
dự kiến sẽ được tìm kiếm trong thư mục hiện tại (trái ngược với $PATH
), thì nó nên được viết. ./var_init.sh