จะเพิ่มพา ธ โฮมไดเร็กตอรี่ที่ Unix ถูกค้นพบได้อย่างไร?


12

ฉันติดตั้งnode.jsในตำแหน่งที่กำหนดเองและเพิ่มตำแหน่งลง$PATHใน.profileไฟล์

$ node --version
v0.6.2
$ which node
$ echo $PATH
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:~/Unix/homebrew/bin
$ cat ~/.profile
export  PATH="$PATH:~/Unix/homebrew/bin"

Node.js ทำงานได้ดี ปัญหามันไม่ได้อยู่ในรายการตามwhichคำสั่ง npmตอนนี้ฉันไม่สามารถติดตั้งได้ เพราะติดตั้งไม่สามารถหาสถานที่ตั้งของnpm node.jsฉันจะสร้างnodeไบนารีที่ค้นพบได้whichอย่างไร

คำตอบ:


11

สิ่งนี้เกิดขึ้นเพราะ~ยังไม่ได้ขยาย เชลล์ของคุณรู้วิธีจัดการกับสิ่งนี้ แต่whichไม่ได้ (หรือโปรแกรมอื่น ๆ ส่วนใหญ่) แต่ให้ทำ:

export "PATH+=:$HOME/Unix/homebrew/bin"

อีกทางเลือกหนึ่งให้หยุดใช้whichและใช้ type -p(มักจะดีกว่า)

นี่คือการสาธิตปัญหา:

$ echo "$PATH"
/usr/local/bin:/usr/bin:/bin
$ export "PATH+=:~/git/yturl"
$ yturl
Usage: yturl id [itag ...]
$ which yturl
$ type -p yturl
/home/chris/git/yturl/yturl
$ export "PATH=/usr/local/bin:/usr/bin:/bin:$HOME/git/yturl"
$ which yturl
/home/chris/git/yturl/yturl

โปรดจำไว้ว่าโปรแกรมอื่น ๆ ที่ดู$PATHอาจไม่เข้าใจความหมายของโปรแกรม~ใดโปรแกรมหนึ่งและถือเป็นส่วนหนึ่งของเส้นทางสัมพัทธ์ $HOMEมันเป็นแบบพกพามากขึ้นในการใช้งาน


1
ในขณะที่วิธีแก้ปัญหาที่เสนอนั้นใช้งานได้คำอธิบายนั้นผิด whichไม่ผิดที่นี่; ควรจะได้รับการขยายตัวในความหมายของ~ PATHมีความผิดปกติในการทุบตีว่ามันขยายตัว~ต่อไปPATHดังนั้นความผิดสองอย่างจึงทำให้ถูกต้อง
Gilles 'หยุดความชั่วร้าย'

@Gilles มันแตกต่างจากที่ฉันพูดอย่างไร
Chris Down

ความจริงที่ว่ามันใช้งานได้กับการเสนอราคา~นั้นเป็นเรื่องแปลก ที่มีตัวอักษร~ใน$PATHมีแนวโน้มที่จะก่อให้เกิดปัญหาในการลงเส้นเพราะมีโปรแกรมที่จะทำแยกของตัวเอง$PATHและพวกเขาไม่รักษา~เป็นพิเศษ
Gilles 'หยุดความชั่วร้าย'

@Gilles ... และนั่นแตกต่างจากที่ฉันพูดในย่อหน้าสุดท้ายของฉันอย่างไร
Chris Down

1
ในขณะที่มันเป็นความจริงทางเทคนิคว่า“ โปรแกรมอื่น…อาจไม่เข้าใจความหมายของ~” ประโยคของคุณทำให้เข้าใจผิด ในบริบทของ$PATHนี่คือทุกโปรแกรมนอกเหนือจาก bash
Gilles 'หยุดความชั่วร้าย'

18

บรรทัดนั้นในของคุณ.profileควรเป็นหนึ่งในนั้น

export  PATH="$PATH:$HOME/Unix/homebrew/bin"
PATH="$PATH:$HOME/Unix/homebrew/bin"
PATH=$PATH:$HOME/Unix/homebrew/bin
PATH=$PATH:~/Unix/homebrew/bin

~ตัวละครที่มีการขยายเท่านั้นที่จะไดเรกทอรีบ้านของคุณเมื่อมันตัวอักษรตัวแรกของคำและมันเป็น unquoted ในสิ่งที่คุณเขียนนั้น~อยู่ระหว่างเครื่องหมายคำพูดคู่และจึงไม่ขยาย แม้ว่าคุณจะเขียนexport "PATH=$PATH:"~/Unix/homebrew/binสิ่ง~นั้นจะไม่ถูกขยายเพราะมันไม่ได้อยู่ที่จุดเริ่มต้นของคำว่าเชลล์

มีการแจกจ่ายพิเศษซึ่งมีวัตถุประสงค์เพื่อเขียนค่าสำหรับPATHและตัวแปรที่คล้ายกัน หาก~อยู่หลังเครื่องหมายเท่ากับที่ทำเครื่องหมายการมอบหมายหรือหาก~อยู่หลัง:ทางด้านขวามือของการมอบหมายก็จะขยายออก เฉพาะการมอบหมายธรรมดาเท่านั้นที่มีการแจกจ่ายexport PATH=…นี้ไม่นับ (เป็นการเรียกไปยังexportbuiltin ซึ่งมีอาร์กิวเมนต์ที่มี=อักขระ)

ที่นี่คุณไม่จำเป็นต้องส่งออกPATHเพราะส่งออกแล้ว คุณไม่จำเป็นต้องโทรหาexportเมื่อคุณเปลี่ยนค่าของตัวแปร (ยกเว้นเชลล์เชลล์เก่าที่คุณจะไม่พบใน OSX หรือ Linux) นอกจากนี้ในการมอบหมายงาน ( exportไม่นับอีกครั้ง) คุณไม่จำเป็นต้องใช้เครื่องหมายคำพูดคู่ล้อมรอบด้านขวามือดังนั้นจึงPATH=$PATH:~/Unix/homebrew/binปลอดภัยแม้ว่าจะ$PATHมีช่องว่าง

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