Chỉ cần sửa nó
Lệnh này hiển thị thông báo lỗi "ERROR: extract: path phải tuyệt đối":
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers
Lỗi không hữu ích - chương trình đã quá bối rối.
Bạn đã biết lỗi là từ ~
, vì nó hoạt động với $HOME
thay thế.
Vấn đề: ~
chỉ được thay thế khi bắt đầu một từ.
Ví dụ, điều này hoạt động với dấu ngã:
echo -extract ~/Downloads
Nếu bạn cần cú pháp tùy chọn với =
, sử dụng $ HOME thay vì ~
là giải pháp sạch nhất;
echo -extract=$HOME/Downloads
Việc luyện tập
Bạn nên biết điều gì:
Có những trường hợp đặc biệt khi ~
được mở rộng khi không ở đầu từ: như một phần của phép gán biến, ngay sau dấu =
. Điều này là khó hiểu ở đây, tất nhiên.
Trường hợp đặc biệt quan trọng khác nó được sử dụng với các biến như PATH. Trong các bài tập biến, ~
cũng được mở rộng sau :
, như sau lần đầu tiên =
.
$ dir=~ sh -c 'echo D2: $dir'
D2: /home/user
$ sh -c 'echo D2: $dir' dir=~
D2:
$ echo Dir: $dir
Dir:
$ dir=~; sh -c 'echo D2: $dir'
D2:
$ echo Dir: $dir
Dir: /home/user
$ sh -c 'echo D2: $dir'; d3=~
D2:
$ echo d3: $d3
d3: /home/user
Ý nghĩa của dấu ngã
Trong một cái vỏ, ~
dấu ngã, không thực sự là một con đường. Nó chỉ được thay thế bởi một con đường $HOME
, một số lần.
Nó là một cái gì đó giống như một tốc ký, hoặc viết tắt, được cung cấp bởi vỏ.
Nó không thể được sử dụng như một con đường nói chung, vỏ "mở rộng" nó thành một con đường chỉ ở những nơi rất đặc biệt.
Và ngay cả khi nó được mở rộng, nó có thể là một cái gì đó khác ngoài thư mục chính.
- Nó chỉ được mở rộng ở đầu từ hoặc trong một phép gán biến sau một
:
hoặc=
- Nó chỉ được mở rộng nếu nó không nằm trong dấu ngoặc kép
- Nó chỉ được mở rộng thành
$HOME
nếu không có thêm ký tự nào trong từ trước một/
Vấn đề trong dòng lệnh
Theo đó, vấn đề trong lệnh của bạn là dấu ngã trong
-extract=~/Downloads/nvidia_installers
không được mở rộng, vì nó không phải là một trong những trường hợp được liệt kê. Đó là tất cả.
Giải pháp có thể là làm cho dấu ngã thành ký tự không được trích dẫn đầu tiên của từ, không có ký tự nào khác trước từ /
đó - đó chỉ là những gì bạn nhận được khi bạn sử dụng một tùy chọn có khoảng trắng trước đối số tùy chọn:
-extract ~/Downloads/nvidia_installers
Một giải pháp khác là sử dụng $HOME
thay thế. Trong một kịch bản, đó thường là sự lựa chọn tốt hơn.
-extract=$HOME/Downloads/nvidia_installers
Thông báo lỗi
Nhưng làm thế nào để thông báo lỗi
"ERROR: extract: path must be absolute."
?
phù hợp với tất cả điều này?
Chúng tôi biết rằng dấu ngã không được mở rộng. Điều đó có nghĩa là chương trình có văn bản đối số bao gồm ~
, nhưng không có /home/auser
đường dẫn. Con đường đó là ~/Downloads/nvidia_installers
- nhưng bây giờ không có vỏ, nên dấu ngã không có ý nghĩa đặc biệt. Nó chỉ là một tên thư mục bình thường. Và như mọi đường dẫn khác của biểu mẫu foo/bar/baz
, nó là một đường dẫn tương đối
Công dụng khác
Nếu có các ký tự sau ~
, như trong ~alice
- với tất cả các quy tắc khác ở trên áp dụng - và có một tên người dùng alice
, được mở rộng sang thư mục chính alice
thay vào đó, nói home/alice
.
Ngoài ra, nếu bạn bob
, ~
sẽ mở rộng /home/bob
và ~bob
sẽ mở rộng tương tự.
Các biến thể ~+
được mở rộng đến thư mục hiện tại,$PWD
Để tham khảo thư mục trước, nơi bạn ở trước cái cuối cùng cd
, bạn có thể sử dụng ~-
, được mở rộng thành $OLDPWD
.
Nếu bạn sử dụng pushd
và popd
, thay vì cd
, bạn sẽ biết rằng ngăn xếp thư mục có thể được truy cập như thế nào ~-2
.
Chi tiết
Tất cả các trường hợp ~
được mở rộng thành một đường dẫn đều được xử lý bằng vỏ . Đối với các chương trình khác, ~
chỉ là một ký tự tên tệp bình thường.
Đối với các định nghĩa chính xác bên trong vỏ, đây là phần có liên quan của
Lưu ý cách thay thế bằng chỉ là một trường hợp đặc biệt của nhiều trường hợp: "Nếu tên đăng nhập này là chuỗi rỗng, dấu ngã được thay thế bằng giá trị của tham số vỏ CHỦ. " :man bash
~
$HOME
Tilde Expansion
If a word begins with an unquoted tilde character (`~'), all of the charac‐
ters preceding the first unquoted slash (or all characters, if there is no
unquoted slash) are considered a tilde-prefix. If none of the characters
in the tilde-prefix are quoted, the characters in the tilde-prefix follow‐
ing the tilde are treated as a possible login name. If this login name is
the null string, the tilde is replaced with the value of the shell parame‐
ter HOME. If HOME is unset, the home directory of the user executing the
shell is substituted instead. Otherwise, the tilde-prefix is replaced with
the home directory associated with the specified login name.
If the tilde-prefix is a `~+', the value of the shell variable PWD replaces
the tilde-prefix. If the tilde-prefix is a `~-', the value of the shell
variable OLDPWD, if it is set, is substituted. If the characters following
the tilde in the tilde-prefix consist of a number N, optionally prefixed by
a `+' or a `-', the tilde-prefix is replaced with the corresponding element
from the directory stack, as it would be displayed by the dirs builtin
invoked with the tilde-prefix as an argument. If the characters following
the tilde in the tilde-prefix consist of a number without a leading `+' or
`-', `+' is assumed.
If the login name is invalid, or the tilde expansion fails, the word is
unchanged.
Each variable assignment is checked for unquoted tilde-prefixes immediately
following a : or the first =. In these cases, tilde expansion is also per‐
formed. Consequently, one may use filenames with tildes in assignments to
PATH, MAILPATH, and CDPATH, and the shell assigns the expanded value.