ตัวหนอนจะถือว่าเป็นเส้นทางที่สัมพันธ์กันหรือไม่?


35

ฉันพยายามแยกส่วนต่าง ๆ ของตัวติดตั้งไลบรารีของ Nvidia cuda ฉันใช้คำสั่งต่อไปนี้:

mkdir ~/Downloads/nvidia_installers
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers

และฉันได้รับข้อความต่อไปนี้:

ERROR: extract: path must be absolute.

และเมื่อฉันพิมพ์คำสั่งด้วยที่อยู่ที่แท้จริงของบ้านของฉันมันทำงานได้อย่างสมบูรณ์

./cuda_6.5.14_linux_64.run -extract=/home/likewise-open/XXX/username/Downloads/nvidia_installers

ฉันสับสนไม่ควรจะเหมือน / home / เช่นเดียวกันเปิด / XXX / ชื่อผู้ใช้?

การทดสอบ:

./cuda_6.5.14_linux_64.run -extract=$HOME/Downloads/nvidia_installers

และใช้งานได้ แต่ฉันไม่รู้ว่าทำไมจึงไม่อนุญาต ~


2
ที่เกี่ยวข้อง: "A" คำนำหน้าตัวหนอน "ประกอบด้วยอักขระ <tilde> ที่ไม่มีเครื่องหมายในตอนต้นของคำตามด้วยอักขระทั้งหมดที่อยู่ก่อนหน้าเครื่องหมาย
อัญประกาศคู่

คำตอบ:


47

Bash จะขยาย a ~ เฉพาะถ้ามันเป็นจุดเริ่มต้นของคำ คุณสามารถเห็นสิ่งนี้ระหว่างคำสั่งต่อไปนี้:

$ echo -extract=~/test
-extract=~/test

oli@bert:~$ echo -extract ~/test
-extract /home/oli/test

Bash ค้นหา~อักขระแบบสแตนด์อโลนและ~/การทดแทนนี้ ไม่มีชุดค่าผสมอื่นหรือรุ่นที่ยกมาจะทำงาน

$HOMEทำงานได้เนื่องจากการแทนที่ตัวแปรมีความทนทานมากกว่า ( $เป็นอักขระพิเศษในขณะที่~มีค่าน้อยกว่ามาก):

$ echo Thisisastring${HOME}awrawr
Thisisastring/home/oliawrawr

ในขณะที่เรากำลังพูดถึง~มันมีการใช้อีกสองอย่างทดแทน:

  • ~+ไดเรกทอรีการทำงานปัจจุบัน (อ่านจาก$PWD)
  • ~-ไดเรกทอรีการทำงานก่อนหน้า (อ่านจาก$OLDPWD)

เช่นเดียวกับธรรมดา~สิ่งเหล่านี้สามารถมีเส้นทางเพิ่มเติมที่ติดอยู่ที่ปลายและอีกครั้งสิ่งเหล่านี้จะต้องเป็นคำนำหน้าของคำหรือ Bash จะไม่สนใจพวกเขา

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับสิ่งนี้ใน man bash | less -p ' Tilde'


2
มันเป็นที่น่าสังเกตว่าzsh ไม่ (หรือมากกว่าสามารถกำหนดค่าให้) ขยาย~หลังจาก=เกินไป ท่ามกลางการปรับปรุงที่สะดวกอื่น ๆ มันมีทุบตีมากกว่า
Jan Hudec

@JanHudec ไม่ - มันซับซ้อนกว่า; มันไม่เกี่ยวกับการขยายหลังจาก=; มันเกี่ยวกับการขยายที่จุดเริ่มต้นของด้านขวา pf การกำหนดตัวแปร นั่นทำให้กรณีของเราสับสนมากขึ้นเมื่อมองอย่างใกล้ชิด - ดูคำตอบของฉัน และzshไม่แตกต่างจากbashในนี้ คำอธิบายสำหรับ 'zsh' เป็นความลับเล็กน้อย: info --subnodes zsh | less +/'14.7.4 Notes'(หน้าคน zsh หายไป)
Volker Siegel

1
@VolkerSiegel: zshสามารถกำหนดค่าได้มาก ในecho -extract=~/testผลลัพธ์zsh ของฉัน-extract=/home/user/testเป็น มันเปิดใช้งานโดยMAGIC_EQUAL_SUBSTตัวเลือก ในด้านทราบฉันมี zsh man pages ทั้งหมดใช้ได้ดี
Jan Hudec

@JanHudec ไม่ต้องสงสัยเลยว่าสามารถzshกำหนดค่าได้ - และการปรับปรุงอื่น ๆ ฉันคาดว่า MAGIC_EQUAL_SUBST (ที่ครอบคลุมใน 14.7.4) จะไม่มีการตั้งค่าเริ่มต้นและไม่ค่อยได้ใช้ ตอนนี้เห็นได้ชัดว่ามีความเกี่ยวข้องมากขึ้นถ้าคุณเปิดใช้งานโดยทั่วไป หลังจากที่ฉันได้รับส่วนตัวอย่างของฉันในรูปแบบที่ดีที่จะทำให้การเพิ่มที่ดี ...
Volker Siegel

@JanHudec เกี่ยวกับหน้า zsh พวกเขาหายไปจากแพ็คเกจ Ubuntu ในขณะที่ขอบคุณสำหรับคำใบ้ไม่ทราบว่าได้รับการแก้ไข; เมื่อมองไปที่ข้อผิดพลาดมันคงเป็นเรื่องที่เกินจริง แต่ไม่น่าเชื่อถือ - นั่นอธิบายได้! ( launchpad: zsh manpages และไฟล์ช่วยเหลือแบบอินไลน์หายไปและAU: zsh man หายไป ... )
Volker Siegel

19

เพียงแก้ไขมัน

คำสั่งนี้แสดงข้อความแสดงข้อผิดพลาด "ข้อผิดพลาด: แยก: เส้นทางจะต้องสมบูรณ์":

./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.

3

~ไม่ใช่เส้นทางต่อ se มันเป็นตัวละครที่ได้รับการดูแลเป็นพิเศษจากเชลล์ที่~หรือ~/หมายถึง "แทนที่ด้วยพา ธ โฮมไดเร็กทอรีของผู้ใช้ปัจจุบัน" ~usernameหมายถึง "แทนที่ด้วยเส้นทางไดเรกทอรีบ้านของชื่อผู้ใช้"

เนื่องจากไม่ใช่เส้นทางจึงเป็นที่รู้จักเฉพาะในบางสถานที่ในคำสั่ง (เป็นอักขระตัวแรกของโทเค็นการแยกสเปซใหม่)

เมื่อขยายแล้วจะถูกแทนที่ด้วยเส้นทางที่แน่นอน

การใช้$HOMEผลงานเพราะ HOME เป็นเพียงตัวแปรที่เชลล์กำหนดและทำตามกฎเชลล์ปกติสำหรับการเปลี่ยนตัวแปร (มันเกิดขึ้นก่อนที่อินพุตจะถูกแบ่งในช่องว่างและดำเนินการ)


1

คุณถูก. ~ / ดาวน์โหลดเหมือนกับ / home / ชื่อผู้ใช้ / ดาวน์โหลด

เครื่องมือติดตั้งและตัวแยกไฟล์บางตัวเลือกอย่างมากเกี่ยวกับตำแหน่งที่ต้องใส่สิ่งต่าง ๆ ฉันคิดว่าอาจเป็นเพราะมันบันทึกไฟล์พา ธ และบันทึกจะไม่ยอมรับ ~ ในเส้นทางที่ยอมรับ

ฉันเพิ่งชินกับการพิมพ์ใน / home / ชื่อผู้ใช้แทน :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.