Bash bir komutu farklı bir dizin bağlamında nasıl yürütebilir?


94

Çok özel dizinlerden çağrılan ortak bir komutum var. Bu program için / bin içinde oturan tek bir çalıştırılabilir dosya vardır ve geçerli çalışma dizini, onu doğru çalıştırmak için çok önemlidir. Komut dosyası, çalıştırıldığı dizinin içinde bulunan dosyaları etkiler.

Şimdi, bir dizinde bazı şeyler yapan özel bir kabuk betiğim var, ancak yukarıda bahsedilen komutu başka bir dizindeymiş gibi çağırmam gerekiyor.

Bunu bir kabuk komut dosyasında nasıl yaparsınız?


Yanıtlar:


39

Bu amaçla yerleşik cdveya pushdve popdyerleşiklerini kullanabilirsiniz . Örneğin:

# do something with /etc as the working directory
cd /etc
:

# do something with /tmp as the working directory
cd /tmp
:

Yerleşikleri diğer herhangi bir komut gibi kullanırsınız ve bir komut dosyasında dizin bağlamını istediğiniz kadar değiştirebilirsiniz.


4
Bir cd -önceki dizine dönmek için bir POSIX kabuğu da var . Yani, söz konusu (a) pushdve popdgerçekten interaktif kullanım amaçlıdır, ve (b) Eğer ki varsaymak zaman güvenli değildir cdbaşladığınız yere, arka özellikle (dahili kısıtlayıcı izinleri kullanabilir karmaşık alt sistemlerin gördüğünüz stackoverflow.com/questions/ 10555284 /… ).
geekosaur

3
Alt

Komut dosyası oluşturmak için, bir alt kabuk muhtemelen daha iyi bir fikirdir .. Ancak, bunu öğrenmekten gerçekten mutluyum popd.
connorbode

:Burada sembolün ne anlama geldiğini açıklar mısınız?
Vadim Kotov

2
@VadimKotov Bence etkin bir işlem yok. Okumaların ilgili bölümü man bash: : [arguments]Etkisi yok; komut, bağımsız değişkenleri genişletmenin ve belirtilen yönlendirmeleri gerçekleştirmenin ötesinde hiçbir şey yapmaz. İade durumu sıfırdır.
boycy

218

cdBir alt kabukta kullanın ; bu tür bir alt kabuğu kullanmanın kısa yolu parantezlerdir.

(cd wherever; mycommand ...)

Bununla birlikte, komutunuzun gerektirdiği bir ortam varsa, onu kullanmak isteyebilecek herhangi bir şeye sorumluluk vermek yerine gerçekten ortamın kendisini sağlamalıdır (kuyu bağlamında çok özel durumlarda kullanılan dahili bir komut olmadığı sürece) daha büyük bir sistem tanımladı, öyle ki herhangi bir arayan kişi zaten ihtiyaç duyduğu ortamı sağlamalıdır. Genellikle bu bir tür kabuk betiği sarmalayıcısı olurdu.


Aynı bağlamda çok satırlı komutlar için \her birinin sonuna bir de ekleyebilirsiniz ;.
Chiramisu

36
(cd /path/to/your/special/place;/bin/your-special-command ARGS)

20

Mevcut çalışma dizininize dönmek istiyorsanız:

current_dir=$PWD;cd /path/to/your/command/dir;special command ARGS;cd $current_dir;
  1. Size current_direşit bir değişken ayarlıyoruzpwd
  2. ondan sonra gidiyoruz cd komutunuzu çalıştırmanız gereken yere
  3. o zaman komutu çalıştırıyoruz
  4. sonra cddeğişkenimize geri döneceğizcurrent_dir

@Apieceofbart tarafından başka bir çözüm pushd && YOUR COMMAND && popd


4
ya da yapabilirsinpushd && YOUR COMMAND && pulld
apieceofbart

4
@apieceofbart Bunun popdyerine demek istediğini düşünüyorum pulld.
Konstantin
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.