วิธีการตั้งค่าไดเรกทอรีสัมพัทธ์เป็นตัวแปร PATH และเรียกใช้สคริปต์ในไดเรกทอรีที่เกี่ยวข้องทั่วโลก


0

ฉันมีสคริปต์บางอย่างในโครงการคอมไพล์ฉันต้องการเข้าถึงทั่วโลกดังนั้นฉันจึงเพิ่มเส้นทางสัมพัทธ์ไปยังโฟลเดอร์สคริปต์อย่างนั้น

vim ~/.bash_profile
export PATH="~/git/scripts/:$PATH"
source ~/.bash_profile

และมีไฟล์ที่~/git/scripts/เรียกว่าechoHelloWorld.shดังนั้นฉันจะทำงานได้echoHelloWorld.shอย่างไรถ้าฉันเป็นตัวอย่างใน~/Downloadsโฟลเดอร์? ฉันทำ

cd ~/Downloads
./echoHelloWorld

เพราะฉันได้ลองแล้ว แต่มันใช้งานไม่ได้และฉันก็ลองchmod +x echoHelloWorld.shโดยไม่มีผลลัพธ์

คำตอบ:


1

TL; DR

ข้อความสั่งพา ธ ของคุณ~/.bash_profileควรมีลักษณะเช่นนี้:

PATH=$PATH:~/git/scripts/

พื้นฐาน.....

มีสามปัญหาเกี่ยวกับวิธีที่คุณเขียน:

  • ไม่ควรใช้exportฟังก์ชันเนื่องจากตัวแปร ( PATH) อยู่ในสภาพแวดล้อมแล้ว เมื่อคุณเข้าสู่ระบบPATHตัวแปรจะถูกสร้างและตั้งค่า คุณไม่จำเป็นต้องใช้exportมันเพราะมันมีอยู่แล้ว

  • ลบเครื่องหมายคำพูดคู่ เครื่องหมายอัญประกาศคู่ทำให้เส้นทางถูกอ่านอย่างแท้จริงเพื่อไม่ให้~เกิดการขยายโฮมไดเร็กทอรี เพื่อให้การขยายตัวหนอนทำงานไม่สามารถอยู่ในเครื่องหมายคำพูดได้ หากคุณต้องการตรวจสอบสิ่งนี้ที่บรรทัดคำสั่งให้พิมพ์ดังต่อไปนี้:

    $ PATH="~/git/scripts:$PATH"
    $ echo $PATH
    ~/git/scripts:/opt/local/bin:...                  <====== INCORRECT RESULT
    
    $ PATH=~/git/scripts:$PATH
    $ echo $PATH
     /Users/foouser/git/scripts:/opt/local/bin:.....  <====== CORRECT!
    
  • ทิลเดอพา ธ ของคุณ (โฮมไดเร็กตอรี่ส่วนตัว) ควรอยู่ท้ายคำสั่งพา ธ ของคุณ เส้นทางของคุณจะอ่านจากซ้ายไปขวานำหน้าเป็นลำดับ กล่าวอีกนัยหนึ่งหากมีคำสั่ง / ฟังก์ชั่นในโฮมไดเร็กตอรี่ของคุณที่มีชื่อเดียวกับที่มีอยู่แล้วในPATHนั้นมันจะถูกดำเนินการ (พบ) ก่อนและอาจมีผลกระทบที่ไม่ตั้งใจ

เมื่อคุณทำการเปลี่ยนแปลงที่~/.bash_profileคุณสามารถเริ่มต้นเซสชั่นของคุณหรือเพียงแค่แหล่งที่มาเช่นที่คุณทำมาก่อนและการเปลี่ยนแปลงจะเกิดขึ้น คุณสามารถยืนยันได้ว่ามันทำงานได้โดยการออกคำสั่งต่อไปนี้ (หรือทั้งสองอย่าง):

$ echo $PATH
$ which echoHelloWorld.sh

ครั้งแรกที่จะส่งออกPATHตามที่กำหนดและที่สองจะบอกคุณว่าในเส้นทางที่มันพบสคริปต์ของคุณ


ในขณะที่ฉันเห็นด้วยกับคุณว่า~/git/scripts:$PATHไม่ถูกต้องbashจะทำการขยายตัวหนอนในแต่ละองค์ประกอบของเส้นทางซึ่งแตกต่างจากเปลือกหอยอื่น ๆ ในกรณีนี้export PATH="~/git/scripts/:$PATH"เครื่องหมายตัวหนอนไม่ใช่เส้นทางสัมพัทธ์
fd0

@ fd0 - มันจะไม่ขยายถ้าคุณใส่ไว้ในเครื่องหมายคำพูด
อัลลัน

ใช่ฉันเข้าใจว่า แต่ที่จริงแล้วองค์ประกอบไม่อยู่ใน~/git/scripts bash
fd0

@ fd0 - แล้วฉันสับสนโดยความคิดเห็นของคุณเพราะฉันอธิบายว่าใน bullet ที่สองของฉัน
อัลลัน

1
อะไร fd0 @ ไม่ว่าจะเป็นอย่างอื่น: ในbash, ~/git/scriptsเป็นส่วนประกอบที่ถูกต้องPATHซึ่งจะได้รับการสืบค้นตามที่คาดไว้ (aka ~ได้รับการขยายตัวในระหว่างการค้นหา) ดูgist.github.com/nohillside/b1eb0d5b0718b77384fb0daefc04dbff
nohillside

1

หากคุณเพิ่มเส้นทางของไฟล์เพื่อเรียกใช้กับPATHตัวแปรของคุณคุณสามารถเรียกใช้คำสั่งของคุณโดยตรง

 echoHelloWorld.sh

ไม่ขึ้นกับไดเรกทอรีที่คุณใช้การรันมันตาม./echoHelloWorld.shจริงจะบอกให้เชลล์ละเว้นPATHและรันสคริปต์จากไดเร็กทอรีปัจจุบัน (ซึ่งไม่มีอยู่)


0
  1. คุณต้องทำให้คำสั่งปฏิบัติการได้

    chmod +x echoHelloWorld.sh 
    # verify it worked.
    ls -l echoHelloWorld.sh 
    
  2. แก้ไขโปรไฟล์ของคุณซึ่งบ่อยที่สุดคือ ~ / .bash_profile เพิ่มไดเรกทอรีลงในตัวแปรพา ธ ของคุณ

    # some people recommend putting your scripts at the end of path. 
    # Less risk of you accidentally overriding a system file name.
    PATH="$PATH:${HOME}/git/scripts/"
    
  3. ฉันจะออกจากเซสชั่น คุณไม่ทราบว่าสคริปต์โปรไฟล์ของคุณต้องการให้ทำงานสองครั้งหรือไม่

  4. เริ่มเซสชันใหม่

  5. ดำเนินการโดย

    echoHelloWorld.sh

นี่คือตัวอย่างของฉัน:

$ oneApp
-bash: oneApp: command not found
$ echo $PATH
/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Developer/Tools:/Users/mac/.nexustools
$ export PATH="~/oneFile:$PATH"
$ echo $PATH
~/oneFile:/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Developer/Tools:/Users/mac/.nexustools
$ oneApp
Running oneApp
$ cat oneApp
cat: oneApp: No such file or directory
$ cat ~/oneFile/oneApp 
#!/bin/bash
echo "Running oneApp"
$ 

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