Dizini değiştirmeden programı her yerden çalıştırın


9

İçinde bulunduğum dizini değiştirmeden program x çalıştıran bir diğer ad oluşturmak istiyorum. Şimdi var:

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

Bu çalışır, ancak dizinimi değiştirir. Ne yapmak istiyorum gibi bir şey:

alias x="./home/path_to_x/x

Ama sonra böyle bir dosya veya dizin almıyorum. Bunun için bir çözüm bilen var mı?


9
takma ad koymak alias x='/home/path_to_x/x'. Daha .önce kullanma /home. .(nokta) geçerli dizini ifade eder.
souravc

2
xGerçekten içerideyken çalıştırılması gerekiyor mu /home/path_to_x? Yoksa belirli bir dizinde bulunan bir programı nasıl çalıştıracağınızdan emin değil misiniz?
Adaephon


Bir diğer benzer soru askubuntu.com/questions/427818/…
c0rp

Yanıtlar:


13

CD YAPMAYIN, sadece mutlak yolunu kullanarak çalıştırın

Bu versiyon:

cd /home/path_to_x && ./x

dizini mutlak bir yola değiştirir ( /home/...kök dizinde nasıl başladığını görürsünüz ) ve daha sonra yürütülebilir dosyayı göreli yolda ./x(yeni çalışma dizinine göre) çalıştırır.

Bu versiyon:

./home/path_to_x/x

çalıştırılabilir dosyayı göreceli yolda çalıştırmaya çalışır ./home/path_to_x/x, yani şu andaki çalışma dizininiz ne olursa olsun . Bu, hatayı neden aldığınızı açıklar - bu göreceli yol gerçekten mevcut değildir.

İstediğiniz komut şöyle olacaktır:

/home/path_to_x/x

mutlak yolu kullanarak (kök dizinden başlayarak /).

Oh, ve sadece takma ad oluşturmak yerine /home/path_to_xkendi ekleyebilirsiniz PATH. Bkz . Tam yolu yazmadan komut dosyaları nasıl çalıştırılır?


Bu, sorulduğu gibi soru için doğru cevaptır.
sonraki duyuruya kadar duraklatıldı.

1
Bu, yalnızca programın aldığı belirli bir dizinde çalıştırılması gerektiğinde yanlış olurpwd
Kaz Wolfe

@Waaaaaat haklı. /home/path_to_x/xişlevsel olarak eşit değildir (cd /home/path_to_x && ./x); çalışıyorsa ya da çalışmıyorsa uygulamaya bağlıdır.
Rmano

Genel olarak haklı olmanıza rağmen, bu özel soru için OP gözle görülür şekilde mutlak yoldan kaçmaya çalışıyordu (sadece tek karakterli bir hatayla). Ancak, eminim bu durumda çalışma dizini önemli olup olmadığını netleştirmek.
Yararsız

8

cdTakma ad ikamesinden sonra yapışmasını istemiyorsanız, (y ile bir alt kabuk kullanın ):

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

kontrol edebilirsin

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

Not çözümü

alias my_y="/home/path_to_x/x" 

tam olarak eşdeğer değildir. Aslında, aracılığıyla denilen eğer my_x, xprogram geçerli dizinde ile çalıştırılan /home/path_to_x/tarafından çağrılan eğer ederken, my_y, xkomut biri olan geçerli dizinde ile çalıştırılır my_yyayınlandı. Bu, ne xyaptığına bağlı olarak önemli olabilir veya olmayabilir .

Hakkında OP çözümü , bu çalışır 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

ama içinde değil 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] % 

Görünüşe göre bash ve zsh listeleri farklı şekillerde yürütüyor ... bu yüzden açık parantez eklemek daha iyi ... bana işaret ettiği için teşekkürler @EliahKagan.


1
İzini benzersiz gibi göründüğünden &daha yüksek bir öncelik &&vermek zsh. Denedim sleep 5 && echo done &de zsh, bash, ksh, mksh, dash, ve hatta bir sigara Bourne tarzı kabuk ( tcsh). Yalnızca ön planda zshdeğerlendirilir sleep 5; diğerleri derhal geri döndü (daha sonra donebeş saniye sonra elbette basıldı ). Öte yandan, bu tamamen bir tuhaflık olsa bile zsh, bence açık ( )(veya { ;}) eklemenin makul olduğunu düşünüyorum , çünkü amacı diğer insanlara (veya senaryoyu veya tarihi daha sonra okurken kendi kendine) aktarıyor.
Eliah Kagan

4

Çalıştırmak istediğiniz dosya zaten çalıştırılabilir durumdaysa, neden PATH değişkeninize eklemiyorsunuz?

Yürütülebilir dosyanız /home/user/aplication/appXsadece girilirse

PATH=$PATH:/home/user/application

senin ~/.bashrcya da~/.profile

Konsolunuzu yeniden başlattıktan sonra, appX

Bence bu en temiz çözüm.


3

&Sonuna a koymak hile gibi görünüyor:

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

2
Emin misiniz? Yürüttükten sonra xsen varsın /home/path_to_x. &Sonunda sadece arka planda süreci gönderin.
Rmano

2
@Rmano Bu aslında işe yarıyor. cdarkaplan işlerinde arayanı etkilemez (bu mantıklıdır - eğer yapsaydı gerçekten garip olurdu). Bunun nedeni, eşzamansız yürütmenin bir alt kabuk kullanmasıdır . Yine de neden işe yaradığını ve ne işe yaradığını ve &arka planda çalışmanın bazen istenmeyen olduğunu açıkladıysa bu daha iyi olurdu, ancak bu (zaten) doğru bir cevaptır. ( Açıkça ( )sözdizimiyle bir alt kabuk yapmak , çoğu zaman olsa da muhtemelen daha iyi bir çözümdür.)
Eliah Kagan

@EliahKagan haklısın. Çözümü kontrol ettim zshve etkili bir şekilde çalışıyor bashve içinde değil zsh... takma adların genişlemesinde bazı farklar olmalı.
Rmano


@Rmano ile ilgili ayarları etkinleştirmek did pushdiçinde zsh(Ben setopt autopushd pushdsilent pushdtohomeve benim cwd hatırlar.)
muru

0

Geçerli pwd'nizin yedeğini alın ve komutunuzu çalıştırdıktan sonra son pwd'nizi geri alın.

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

O Rmano takma adının etkisini yanlış anladın. Komut satırı engellenmedi. Sadece takma adın ( test) çıktısı imleci bir sonraki satıra itti. Yine de orada istediğinizi yapabilirsiniz (yeni bir istem açmak için enter tuşuna basmak da dahil).
muru

evet, evet doğru. @mure: |
αғsнιη

Çift tırnak kullandığınızdan, değişkenin takma ad tanımlandığı sırada geçerli dizini içereceğini unutmayın . Takma ad genişletilinceye kadar değerlendirmeyi ertelemek için tek tırnak kullanın. Ancak, pushdve popdCevabın ne yapmak. alias x='pushd /home/path_to_x && ./x && popd'
sonraki duyuruya kadar duraklatıldı.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.