tilde=\~${PWD#~}
Tôi nghĩ đó là những gì bạn muốn?
Điều gì gọn gàng về dấu ngã là khi nó được mở rộng như một mẫu mà nó không cần trích dẫn. Sử dụng $HOME
theo cách tương tự mà không có dấu ngoặc kép sẽ cho kết quả không thể đoán trước bởi vì bất kỳ ký tự cấu thành nào của nó có thể là ký tự mẫu, và do đó, nó có thể không luôn luôn hiển thị kết quả như mong đợi.
Nhưng việc mở rộng dấu ngã được xác định là luôn luôn xảy ra như thể đó là kết quả của việc mở rộng được trích dẫn, và vì vậy kết quả của nó là có thể dự đoán được. Điều này dường như đúng trong thực tế mọi vỏ mà tôi đã thử nghiệm cho cả case
mẫu và mẫu tham số với các ngoại lệ đáng chú ý của cả hai ksh93
và mksh
vì bất kỳ lý do nào - dường như cả hai đều không tôn trọng khía cạnh được trích dẫn của dấu ngã trong khả năng đó.
Một điều thú vị khác về điều này là bạn có thể xác định lại $HOME
để xử lý bất kỳ thư mục nào theo cùng một cách. Ví dụ:
cd ~
HOME=/some/prefix/I/would/like/to/trim
#or, perhaps more usefully, some scripted means of arriving at same
tilde=\~${OLDPWD#~}
HOME=$PWD
Đây là một ví dụ khác:
set 1 2 3 4 5 \~
cd ~; cd -; HOME= IFS=/
for d do shift
HOME=${*#~/}/$d
set ~ "$d" $HOME
done; cd -; HOME=$PWD
printf %s\\n "$@"
5/4/3/2/1/2/3/4/5/~/1/2/3/4/5/~
~
5
4
3
2
1
2
3
4
5
~
1
2
3
4
5
~