เรียกใช้โปรแกรมจากที่ใดก็ได้โดยไม่ต้องเปลี่ยนไดเรกทอรี


9

ฉันต้องการสร้างนามแฝงซึ่งรันโปรแกรม x โดยไม่เปลี่ยนไดเรกทอรีปัจจุบันที่ฉันเป็นอยู่สิ่งที่ฉันมีตอนนี้คือ:

alias x = "cd /home/path_to_x && ./x"

สิ่งนี้ใช้ได้ แต่เปลี่ยนไดเรกทอรีของฉัน สิ่งที่ฉันต้องการทำคือ:

alias x="./home/path_to_x/x

แต่ฉันจะไม่ได้รับไฟล์หรือไดเรกทอรีดังกล่าว ใครรู้วิธีแก้ปัญหาสำหรับเรื่องนี้?


9
alias x='/home/path_to_x/x'ตั้งชื่อแทนเช่น อย่าใช้ก่อน. (จุด) หมายถึงไดเรกทอรีปัจจุบัน /home.
souravc

2
ไม่xจำเป็นต้องถูกเรียกใช้ขณะอยู่ใน/home/path_to_x? หรือคุณเพียงไม่แน่ใจเกี่ยวกับวิธีการเรียกใช้โปรแกรมที่อยู่ในไดเรกทอรีเฉพาะหรือไม่
Adaephon


อีกหนึ่งคำถามที่คล้ายกันaskubuntu.com/questions/427818/ …
c0rp

คำตอบ:


13

อย่า CD เพียงใช้มันโดยใช้พา ธ สัมบูรณ์

รุ่นนี้:

cd /home/path_to_x && ./x

เปลี่ยนไดเร็กทอรีเป็นพา ธ สัมบูรณ์ (คุณเห็นวิธี/home/...เริ่มต้นที่รูทไดเร็กทอรี) จากนั้นรันไฟล์ปฏิบัติการที่พา ธสัมพัทธ์./x (นั่นคือสัมพันธ์กับไดเร็กทอรีการทำงานใหม่)

รุ่นนี้:

./home/path_to_x/x

พยายามที่จะเรียกใช้ปฏิบัติการที่ที่ญาติเส้นทาง./home/path_to_x/xซึ่งหมายความว่าเมื่อเทียบกับสิ่งที่ไดเรกทอรีการทำงานปัจจุบันของคุณอยู่ในขณะนี้ นั่นอธิบายว่าทำไมคุณถึงได้รับข้อผิดพลาด - เส้นทางสัมพัทธ์นี้ไม่มีอยู่จริง

คำสั่งที่คุณต้องการจะเป็น:

/home/path_to_x/x

ใช้พา ธ สัมบูรณ์ (เริ่มต้นที่ไดเรกทอรีราก/) อีกครั้ง

โอ้และคุณสามารถเพิ่ม/home/path_to_xไปยังPATHแทนที่จะสร้างนามแฝงได้ โปรดดู: วิธีเรียกใช้สคริปต์โดยไม่พิมพ์เส้นทางแบบเต็มได้อย่างไร


นี่คือคำตอบที่ถูกต้องสำหรับคำถามที่ถูกวาง
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

1
นี่จะไม่ถูกต้องหากโปรแกรมจำเป็นต้องทำงานในไดเรกทอรีเฉพาะที่ได้รับจากpwd
Kaz Wolfe

@Whaaaaaat ถูกต้อง /home/path_to_x/xไม่ได้เป็นหน้าที่เทียบเท่า(cd /home/path_to_x && ./x); ถ้ามันใช้งานได้หรือไม่นั้นขึ้นอยู่กับแอปพลิเคชัน
Rmano

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

8

หากคุณไม่ต้องการที่cdจะติดหลังจากการทดแทนนามแฝงใช้ subshell กับ(y ):

alias my_x="(cd /home/path_to_x && ./x)&" 

คุณสามารถตรวจสอบกับ

alias test_y="(cd /tmp && sleep 10 ) & "

โปรดทราบว่าการแก้ปัญหา

alias my_y="/home/path_to_x/x" 

ไม่เทียบเท่าที่แน่นอน ในความเป็นจริงถ้าเรียกว่าผ่านmy_xการxโปรแกรมจะดำเนินการกับไดเรกทอรีปัจจุบัน/home/path_to_x/ในขณะที่ถ้าเรียกตามmy_y, xมีการเรียกใช้กับไดเรกทอรีปัจจุบันซึ่งเป็นหนึ่งในที่คำสั่งmy_yออกมา สิ่งนี้อาจมีความสำคัญหรือไม่ขึ้นอยู่กับสิ่งที่xกำลังทำ

เกี่ยวกับโซลูชัน OPมันทำงานในbash:

romano@RRyS:~$ pwd
/home/romano
romano@RRyS:~$ alias x="cd /bin && ./echo A >/dev/null  &"
romano@RRyS:~$ x
[1] 16611
romano@RRyS:~$ pwd
/home/romano

แต่ไม่ใช่ในzsh:

[romano:~] % pwd
/home/romano
[romano:~] % alias x="cd /bin && ./echo A >/dev/null &"
[romano:~] % x
[1] 16744
[1]  + 16744 done       ./echo A > /dev/null                                    
1& [romano:/bin] % pwd
/bin
[romano:/bin] % 

ดูเหมือนว่า bash และ zsh จะรันรายการในวิธีที่ต่างกัน ... ดังนั้นจึงเป็นการดีกว่าที่จะเพิ่มวงเล็บที่ชัดเจน ... ขอบคุณ @EliahKagan สำหรับการชี้ไปที่ฉัน


1
ให้ต่อท้าย&ความสำคัญสูงกว่าดูเหมือนว่ามันอาจจะไม่ซ้ำกับ&& zshฉันพยายามsleep 5 && echo done &ในzsh, bash, ksh, mksh, dashและแม้กระทั่งหนึ่งเปลือกไม่ใช่บอร์นสไตล์ ( tcsh) zshประเมินเฉพาะsleep 5ในพื้นหน้า คนอื่น ๆ กลับมาทันที (จากนั้นก็พิมพ์doneอีกห้าวินาทีต่อมาแน่นอน) ในทางกลับกันแม้ว่านี่จะเป็นลักษณะเฉพาะของzshฉันคิดว่าการเพิ่ม( )(หรือ{ ;}) ชัดเจนมีเหตุผลตามที่มันสื่อถึงความตั้งใจที่จะมนุษย์คนอื่น ๆ (หรือเพื่อตัวเองเมื่ออ่านสคริปต์หรือประวัติศาสตร์ในภายหลัง)
Eliah Kagan

4

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

หากไฟล์ที่ปฏิบัติการได้ของคุณถูก/home/user/aplication/appXป้อน

PATH=$PATH:/home/user/application

ถึงคุณ~/.bashrcหรือ~/.profile

หลังจากรีสตาร์ทคอนโซลของคุณคุณสามารถเรียกใช้เพียงแค่นั้น appX

ฉันคิดว่านี่เป็นทางออกที่สะอาดที่สุด


3

การวาง&ท้ายที่สุดดูเหมือนจะเป็นการหลอกลวง:

alias x = "cd /home/path_to_x && ./x &"

2
คุณแน่ใจไหม? หลังจากการดำเนินการที่คุณอยู่ในx ที่สิ้นสุดเพียงแค่ส่งกระบวนการในพื้นหลัง /home/path_to_x&
Rmano

2
@Rmano มันใช้งานได้จริง cdงานแบ็คกราวน์จะไม่ส่งผลกระทบต่อผู้โทร (ซึ่งก็สมเหตุสมผลแล้ว - มันจะแปลกจริง ๆ ถ้าพวกเขาทำ) เพราะนี่คือการดำเนินการไม่ตรงกันใช้ subshell แม้ว่ามันจะดีกว่านี้ถ้ามันอธิบายว่าทำไมมันถึงทำงานได้ดีและมีอะไร&บ้าง - และวิธีการทำงานในพื้นหลังบางครั้งก็ไม่เป็นที่พึงปรารถนา - นี่คือคำตอบที่ถูกต้อง (แล้ว) ( การทำ subshell ด้วย( )syntax อย่างที่คุณแนะนำน่าจะเป็นวิธีแก้ปัญหาที่ดีกว่าโดยส่วนใหญ่)
Eliah Kagan

@EliahKagan คุณพูดถูก ฉันตรวจสอบโซลูชันด้วยzshและทำงานอย่างมีประสิทธิภาพbashและไม่ได้อยู่ในzsh... จะต้องมีความแตกต่างในวิธีการขยายชื่อแทน
Rmano


@Rmano ทำคุณเปิดใช้งานการตั้งค่าที่เกี่ยวข้องกับpushdในzsh(ฉันมีsetopt autopushd pushdsilent pushdtohomeและมันจำ CWD ของฉัน.)
Muru

0

รับข้อมูลสำรองของ pwd ปัจจุบันของคุณและหลังจากเรียกใช้คำสั่งของคุณให้เลิกทำ pwd ล่าสุดของคุณ

alias x='dwp=$(pwd) && cd /home/path_to_x && ./x && cd $dwp'

คุณเข้าใจผิดถึงผลกระทบของนามแฝงของ Rmano บรรทัดคำสั่งไม่ถูกบล็อก เป็นเพียงการส่งออกของนามแฝง ( test) ผลักเคอร์เซอร์ไปที่บรรทัดถัดไป คุณยังสามารถทำอะไรก็ได้ที่คุณต้องการ (รวมถึงการกด Enter เพื่อเปิดพรอมต์ใหม่)
muru

ใช่ถูกต้องแล้ว @mure: |
αғsнιη

ทราบว่าตั้งแต่คุณใช้คำพูดสองตัวแปรจะรวมถึงไดเรกทอรีปัจจุบันในเวลานามแฝงที่กำหนดไว้ ใช้เครื่องหมายคำพูดเดี่ยวเพื่อเลื่อนการประเมินผลจนกว่าจะขยายนามแฝง อย่างไรก็ตามpushdและpopdทำในสิ่งที่คำตอบของคุณทำ alias x='pushd /home/path_to_x && ./x && popd'
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.