เพียงแก้ไขมัน
คำสั่งนี้แสดงข้อความแสดงข้อผิดพลาด "ข้อผิดพลาด: แยก: เส้นทางจะต้องสมบูรณ์":
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers
ข้อผิดพลาดไม่เป็นประโยชน์ - โปรแกรมสับสนเกินไปแล้ว
คุณรู้อยู่แล้วว่าข้อผิดพลาดนั้นมาจากการ~
ทำงาน$HOME
แทน
ปัญหา: ~
จะถูกแทนที่เมื่อเริ่มต้นคำเท่านั้น
ตัวอย่างเช่นสิ่งนี้ใช้ได้กับเครื่องหมายตัวหนอน:
echo -extract ~/Downloads
หากคุณต้องการไวยากรณ์ตัวเลือกด้วยการ=
ใช้ $ HOME แทนที่จะ~
เป็นโซลูชันที่สะอาดที่สุด
echo -extract=$HOME/Downloads
การปฏิบัติ
สิ่งที่คุณควรรู้
มีกรณีพิเศษที่มีโดยตรงหลังจากที่เป็นส่วนหนึ่งของการกำหนดตัวแปร:~
Get ขยายตัวเมื่อไม่ได้อยู่ที่จุดเริ่มต้นของคำ =
ซึ่งทำให้สับสนที่นี่แน่นอน
กรณีพิเศษที่สำคัญอื่น ๆ สำหรับใช้กับตัวแปรเช่น PATH ในการกำหนดตัวแปร, ~
มีการขยายหลังจากเช่นหลังจากที่ครั้งแรก:
=
$ 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
ความหมายของเครื่องหมายตัวหนอน
ในเปลือกหอย~
ตัวหนอนไม่ใช่เส้นทางจริงๆ มันถูกแทนที่ด้วยเส้นทาง$HOME
บางครั้ง
มันเป็นเหมือนชวเลขหรือตัวย่อที่เชลล์จัดเตรียมไว้ให้
มันไม่สามารถใช้งานได้เหมือนพา ธ โดยทั่วไปเชลล์ "ขยาย" ไปยังพา ธ เฉพาะในสถานที่ที่พิเศษมาก
และแม้ว่ามันจะถูกขยายออกไปมันสามารถเป็นอย่างอื่นที่ไม่ใช่โฮมไดเร็กตอรี่
- มันจะขยายที่จุดเริ่มต้นของคำหรือในการกำหนดตัวแปรหลังจาก
:
หรือ=
- มันจะขยายเฉพาะถ้ามันไม่ได้อยู่ในคำพูด
- มันจะขยายออกไป
$HOME
หากไม่มีตัวอักษรเพิ่มเติมในคำก่อนหน้า/
ปัญหาในบรรทัดคำสั่ง
ตามนี้ปัญหาในคำสั่งของคุณคือตัวหนอนใน
-extract=~/Downloads/nvidia_installers
ไม่ขยายเนื่องจากไม่ใช่หนึ่งในเคสที่แสดงรายการ นั่นคือทั้งหมดที่
วิธีแก้ปัญหาอาจทำให้ตัวหนอนเป็นอักขระตัวแรกที่ไม่มีเครื่องหมายของคำโดยไม่มีอักขระอื่นก่อนหน้าถัดไป/
นั่นคือสิ่งที่คุณจะได้รับเมื่อคุณใช้ตัวเลือกที่มีช่องว่างหน้าอาร์กิวเมนต์ตัวเลือก:
-extract ~/Downloads/nvidia_installers
ทางออกอื่นจะใช้$HOME
แทน ในสคริปต์นั้นมักจะเป็นตัวเลือกที่ดีกว่า
-extract=$HOME/Downloads/nvidia_installers
ข้อความแสดงข้อผิดพลาด
แต่เกิดข้อผิดพลาดได้
"ERROR: extract: path must be absolute."
อย่างไร
พอดีกับทั้งหมดนี้ไหม
เรารู้ว่าตัวหนอนไม่ได้ขยายตัว นั่นหมายความว่าโปรแกรมได้รับข้อความโต้แย้งรวมถึง~
แต่ไม่มี/home/auser
พา ธ เส้นทางนั้นคือ~/Downloads/nvidia_installers
- แต่ตอนนี้ไม่มีกระสุนดังนั้นตัวหนอนจึงไม่มีความหมายพิเศษ มันเป็นเพียงชื่อไดเรกทอรีปกติ และเช่นเดียวกับเส้นทางอื่น ๆ ทั้งหมดของแบบฟอร์มfoo/bar/baz
มันเป็นเส้นทางสัมพัทธ์
การใช้งานอื่น ๆ
หากมีตัวละครหลังจากที่~
ในขณะที่~alice
- กับทุกกฎระเบียบอื่น ๆ ข้างต้นสมัคร - และมีชื่อผู้ใช้alice
ที่มีการขยายไปยังไดเรกทอรีบ้านแทนการพูดalice
นอกจากนี้ถ้าคุณมี, จะขยายตัวออกไปและจะขยายไปยังเดียวกันhome/alice
bob
~
/home/bob
~bob
ชุด~+
ตัวเลือกจะถูกขยายไปยังไดเรกทอรีปัจจุบัน$PWD
เพื่ออ้างถึงไดเรกทอรีก่อนหน้านี้ที่คุณมีก่อนที่สุดท้ายที่cd
คุณสามารถใช้ซึ่งจะขยายไปยัง~-
$OLDPWD
ถ้าคุณใช้pushd
และpopd
แทนที่จะแล้วคุณจะรู้ว่าสแต็คไดเรกทอรีที่สามารถเข้าถึงได้เช่นcd
~-2
รายละเอียด
ทุกกรณีที่~
มีการขยายไปยังเส้นทางที่จะ handeled โดยเปลือก สำหรับโปรแกรมอื่น~
เป็นเพียงชื่อไฟล์ปกติ
สำหรับคำจำกัดความที่แน่นอนภายในเชลล์นี่คือส่วนที่เกี่ยวข้องของ
หมายเหตุวิธีการแทนที่โดยเป็นกรณีพิเศษหนึ่งกรณีในหลาย ๆ กรณี: "ถ้าชื่อล็อกอินนี้คือสตริงว่างค่า tilde จะถูกแทนที่ด้วยค่าของพารามิเตอร์เชลล์ HOME " :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.