Chạy chương trình từ bất cứ đâu mà không thay đổi thư mục


9

Tôi muốn tạo một bí danh, chạy chương trình x, mà không thay đổi thư mục hiện tại tôi đang ở. Cái tôi có bây giờ là:

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

Điều này hoạt động, nhưng thay đổi thư mục của tôi. Những gì tôi muốn làm là một cái gì đó như:

alias x="./home/path_to_x/x

Nhưng sau đó tôi không nhận được tập tin hoặc thư mục như vậy. Bất cứ ai biết một cách giải quyết cho điều này?


9
thiết lập một bí danh như alias x='/home/path_to_x/x'. Đừng sử dụng .trước /home. .(dấu chấm) đề cập đến thư mục hiện tại.
souravc

2
xthực sự cần phải được chạy trong khi đang ở trong /home/path_to_x? Hay bạn không chắc chắn về cách chạy một chương trình nằm trong một thư mục cụ thể?
Adaephon


Một tương tự nhiều câu hỏi askubuntu.com/questions/427818/...
c0rp

Câu trả lời:


13

KHÔNG CD, chỉ cần chạy nó bằng đường dẫn tuyệt đối của nó

Phiên bản này:

cd /home/path_to_x && ./x

thay đổi thư mục thành một đường dẫn tuyệt đối (bạn thấy cách /home/...bắt đầu tại thư mục gốc) và sau đó chạy tệp thực thi tại đường dẫn tương đối./x (nghĩa là liên quan đến thư mục làm việc mới).

Phiên bản này:

./home/path_to_x/x

cố gắng chạy tệp thực thi tại đường dẫn tương đối./home/path_to_x/x , có nghĩa là liên quan đến bất cứ thư mục làm việc hiện tại của bạn . Điều đó giải thích tại sao bạn gặp lỗi - đường dẫn tương đối này thực sự không tồn tại.

Lệnh bạn muốn sẽ là:

/home/path_to_x/x

sử dụng đường dẫn tuyệt đối (bắt đầu từ thư mục gốc /) một lần nữa.

Ồ, và bạn cũng có thể chỉ cần thêm /home/path_to_xvào PATHthay vì tạo bí danh. Xem: Làm thế nào để chạy tập lệnh mà không cần gõ đường dẫn đầy đủ?


Đây là câu trả lời chính xác cho câu hỏi như được đặt ra.
Tạm dừng cho đến khi có thông báo mới.

1
Điều này sẽ chỉ không chính xác nếu chương trình cần được chạy trong một thư mục cụ thể mà nó nhận được từpwd
Kaz Wolfe

@Whaaaaaat đúng. /home/path_to_x/xkhông có chức năng tương đương với (cd /home/path_to_x && ./x); nếu nó hoạt động hay không phụ thuộc vào ứng dụng.
Rmano

Mặc dù bạn nói chung, nhưng đối với câu hỏi cụ thể này, OP rõ ràng đang cố gắng chạy từ đường dẫn tuyệt đối (chỉ với một lỗi một ký tự). Tuy nhiên, tôi chắc chắn họ có thể làm rõ nếu thư mục làm việc là quan trọng trong trường hợp này.
Vô dụng

8

Nếu bạn không muốn cddính sau khi thay thế bí danh, hãy sử dụng một nhánh con với (y ):

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

bạn có thể kiểm tra nó với

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

Lưu ý rằng giải pháp

alias my_y="/home/path_to_x/x" 

không chính xác tương đương. Trong thực tế, nếu được gọi qua my_x, xchương trình được chạy với một thư mục hiện tại /home/path_to_x/, trong khi nếu được gọi bởi my_y, thì xđược chạy với một thư mục hiện tại là thư mục my_yđược phát lệnh. Điều này có thể quan trọng hay không phụ thuộc vào những gì xđang làm.

Về giải pháp OP , nó hoạt động trong 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

nhưng không ở 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] % 

Có vẻ như bash và zsh thực thi danh sách theo các cách khác nhau ... vì vậy tốt hơn là thêm dấu ngoặc đơn rõ ràng ... cảm ơn @EliahKagan đã chỉ cho tôi.


1
Đưa ra &mức độ ưu tiên cao hơn so với &&có vẻ như nó là duy nhất zsh. Tôi cố gắng sleep 5 && echo done &trong zsh, bash, ksh, mksh, dash, và thậm chí một phi Bourne kiểu vỏ ( tcsh). Chỉ được zshđánh giá sleep 5ở phía trước; tất cả những người khác trở lại ngay lập tức (tất nhiên sau đó cũng được in donenăm giây sau đó). Mặt khác, ngay cả khi điều này hoàn toàn là một đặc thù zsh, tôi nghĩ rằng việc thêm rõ ràng ( )(hoặc { ;}) là hợp lý, vì nó truyền đạt ý định cho những người khác (hoặc cho chính mình, khi đọc kịch bản hoặc lịch sử sau này).
Eliah Kagan

4

Nếu tệp mà bạn muốn chạy đã được thực thi, tại sao bạn không thêm nó vào biến PATH của mình?

Nếu tập tin thực thi của bạn /home/user/aplication/appXchỉ cần nhập

PATH=$PATH:/home/user/application

cho bạn ~/.bashrchoặc~/.profile

Sau khi khởi động lại bàn điều khiển, bạn có thể chạy nó đơn giản với appX

Tôi nghĩ rằng đây là giải pháp sạch nhất.


3

Đặt một &ở cuối dường như để thực hiện các mẹo:

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

2
Bạn có chắc không? Sau khi thực hiện xbạn đang ở /home/path_to_x. Các &cuối cùng chỉ cần gửi cho quá trình này ở chế độ nền.
Rmano

2
@Rmano Điều này thực sự hoạt động. cds trong các công việc nền không ảnh hưởng đến người gọi (điều này có ý nghĩa - sẽ thực sự kỳ lạ nếu họ làm). Điều này là do thực thi không đồng bộ sử dụng một lớp con . Mặc dù điều này sẽ tốt hơn nếu nó giải thích lý do tại sao nó hoạt động và những gì &không - và cách chạy trong nền đôi khi không mong muốn - đây là (đã) một câu trả lời đúng. ( Hoàn toàn tạo ra một subshell với ( )cú pháp, như bạn đề xuất , có lẽ là một giải pháp tốt hơn hầu hết thời gian.)
Eliah Kagan

@EliahKagan bạn nói đúng. Tôi đã kiểm tra giải pháp với zshvà hiệu quả là nó hoạt động trong bashvà không zsh... phải là một số khác biệt trong cách mở rộng các bí danh.
Rmano


@Rmano đã làm bạn kích hoạt các thiết lập liên quan đến pushdzsh(Tôi có setopt autopushd pushdsilent pushdtohome, và nó nhớ cwd của tôi.)
muru

0

Nhận sao lưu pwd hiện tại của bạn và sau khi chạy lệnh của bạn, hoàn tác pwd cuối cùng của bạn.

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

Bạn đã hiểu nhầm tác dụng của bí danh Rmano đó. Dòng lệnh không bị chặn. Chỉ là đầu ra của bí danh ( test) đã đẩy con trỏ đến dòng tiếp theo. Bạn vẫn có thể làm bất cứ điều gì bạn muốn ở đó (bao gồm nhấn enter để mở một dấu nhắc mới).
muru

vâng, đúng rồi @mure: |
αғsнιη

Lưu ý rằng vì bạn sử dụng dấu ngoặc kép, biến sẽ bao gồm thư mục hiện tại tại thời điểm bí danh được xác định . Sử dụng dấu ngoặc đơn để trì hoãn đánh giá cho đến khi bí danh được mở rộng. Tuy nhiên, pushdpopdlàm những gì câu trả lời của bạn làm. alias x='pushd /home/path_to_x && ./x && popd'
Tạm dừng cho đến khi có thông báo mới.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.