Một thời gian trước tôi đã giải quyết alias
cho loại công việc này. Đây là một số câu trả lời khác của tôi:
Tuy nhiên, đôi khi có thể tách rời việc đánh giá và thực hiện các tuyên bố đó. Ví dụ, alias
có thể được sử dụng để đánh giá trước một lệnh. Trong ví dụ sau, định nghĩa biến được lưu vào bí danh chỉ có thể được khai báo thành công nếu $var
biến mà nó đang đánh giá không chứa byte nào không khớp với chữ số ASCII hoặc _.
LC_OLD=$LC_ALL LC_ALL=C
for var do val=${var#*=} var=${var%%=*}
alias "${var##*[!_A-Z0-9a-z]*}=_$var=\$val" &&
eval "${var##[0-9]*}" && unalias "$var"
done; LC_ALL=$LC_OLD
eval
được sử dụng ở đây để xử lý việc gọi mới alias
từ ngữ cảnh varname được trích dẫn - không phải cho phép gán chính xác. Và eval
chỉ được gọi hoàn toàn nếu alias
định nghĩa trước đó thành công và trong khi tôi biết rất nhiều cách triển khai khác nhau sẽ chấp nhận rất nhiều loại giá trị khác nhau cho tên bí danh, tôi vẫn chưa tìm thấy một vỏ sẽ chấp nhận một vỏ hoàn toàn trống .
_$var
Tuy nhiên, định nghĩa trong bí danh là dành cho và điều này là để đảm bảo rằng không có giá trị môi trường quan trọng nào được ghi lại. Tôi không biết về bất kỳ giá trị môi trường đáng chú ý nào bắt đầu bằng dấu _ và đó thường là đặt cược an toàn cho khai báo bán riêng.
Dù sao, nếu định nghĩa bí danh thành công, nó sẽ khai báo một bí danh được đặt tên cho $var
giá trị của. Và eval
sẽ chỉ gọi rằng alias
nếu nó cũng không bắt đầu bằng một số - người khác eval
chỉ nhận được một đối số null. Vì vậy, nếu cả hai điều kiện được đáp ứng đều eval
gọi alias
và định nghĩa biến được lưu trong đó alias
được thực hiện, sau đó bí danh mới sẽ nhanh chóng bị xóa khỏi bảng băm.
Cũng hữu ích alias
trong bối cảnh này là bạn có thể in công việc của bạn. alias
sẽ in một tuyên bố gấp đôi an toàn cho trích dẫn vỏ khi được yêu cầu.
sh -c "IFS=\'
alias q=\"\$*\" q" -- \
some args which alias \
will print back at us
ĐẦU RA
q='some'"'"'args'"'"'which'"'"'alias'"'"'will'"'"'print'"'"'back'"'"'at'"'"'us'