Belirli bir dizinde cd'le olmadan belirli bir komutu çalıştır?


42

Komutu farklı bir dizinde kullanmak zorunda kalmadan yürütmenin bir yolu var mı cd? Basitçe cdgirip çıkabileceğimi biliyorum cd, ancak yalnızca fazladan adımları atma olasılıklarıyla ilgileniyorum :)


O bunu yapar bir komut dosyası yapmak için oldukça Önemsiz: echo "#!/bin/bash; cd $1; exec $2" > /usr/local/bin/execindirectory; chmod +x /usr/local/bin/execindirectory. Gibi gerçekten seçenek -dve "gibi" etiketleri "seçeneği desteklemek istiyorsanız, biraz daha çaba sarf etmeniz gerekebilir .
LawrenceC

Kullanıcı tarafından bilinmeyen bir cevapta belirtildiği gibi, burada ve yorumlarda verdiğiniz tüm örnekler diğer çözümler tarafından daha iyi ele alındığından, burada çözülmesi gereken bir sorun olup olmadığı belirsizdir. Daha iyi bir örnek bulabilir misin?
Caleb

Yanıtlar:


55

Bu sayılır mı bilmiyorum ama bir deniz kabuğu yapabilirsiniz:

$ (cd /var/log && cp -- *.log ~/Desktop)

Dizin yalnızca bu alt kabuk için değiştirilir, bu nedenle cd -daha sonra ihtiyaç duyma işinden kaçınırsınız .


2
Genelde böyle yaparım.
Adam Byrtek

Güzel, alt mermileri tamamen unutmuştum, bu durumda çok kullanışlı.
Naftuli Kay

4
İki ve işareti ile noktalı virgül dışarı potansiyel kaos, alt önlemek için: $ (cd /var/log && cp *.log ~/Desktop). Bu şekilde, eğer dizin yoksa, başka bir komut yürütülmez.
Naftuli Kay

Benim kadar saf olan herkes için not: başlangıçtaki $ komutun bir parçası değil, ondan sonraki her şey.
Maltronic

14

Bazı programlar, kendileri chdir (2) yapmalarını söyleyebileceğiniz seçeneklere sahiptir (örn. GNU tar-C / s --directory).

Bu tür programlar dışında olsa da, bir şey chdir gerekir . Bir çeşit derlenmiş “ikili” program yazabilir ve kullanabilirsiniz, ancak kabuğun yapması yerine, bunun pek bir faydası olmaz.

Başka bir cevaba yapılan yorumda bir örnek verdiniz:

execindirectory -d /var/log "cp *.log ~/Desktop"

Yana *.logdesen kabuğun kendisi (değil tarafından genişletilir cp ), bir şey zorunda kalacak İşlevin bir kabuğu olan önce dizine komutunu değerlendirir.

Sadece “cd arkasına” zorunda kaçınarak içinde ilginç varsa, o zaman etkisini izole etmek için altkabuk kullanabilirsiniz cd sizin çalışma kabuk örneğinden.

(cd /path/to/dir && some command)

Bunu bir kabuk fonksiyonunda paketleyebilirsiniz. ( -dDizin gerçekten isteğe bağlıysa, bu komut için çok az nokta bulunduğundan seçeneği örnek kullanımınızdan kaldırdım.)

runindir() { (cd "$1" && shift && eval "$@"); }

runindir /var/log 'cp *.log ~/Desktop'  # your example
runindir /var/log cp \*.log \~/Desktop  # eval takes multiple args

runindir /var/log cp \*.log ~/Desktop   # it is okay to expand tilde first

2
Kişisel olarak pushd / popd kullanırım dışında bu çözümü seviyorum
NJ

10

Diğer insanlar tarafından verilen cevapların değerini zedelemek değil, fakat istediğinin bu olduğuna inanıyorum :

(cd /path/to && ./executable [ARGS])

cdAlt kabukta çağrılacak pareleri not edin .


Sanmıyorum Anladığım kadarıyla, başlangıç ​​dizinine girmek istiyor.
Adam Byrtek

Oh, bunu tamamen denizaltısına sarmayı unuttum. Cevabım düzeltildi, teşekkür ederim.
alex

4

İşte cdnerede olduğunuzu (Bash kullanarak) geri bırakmanıza izin vermesi gereken bir şey , çünkü bunu yapmayı unutma, sorunun amacı gibi görünüyor:

# Save where you are and cd to other dir
pushd /path/to/dir/that/needs/to/be/current/dir

run-your-command

# Get back where you were at the beginning.
popd

(EDIT: biraz daha kısa versiyon, @ Random832 sayesinde)


1
pushd other-diryerine , sadece olabilirpushd .; cd other-dir
Random832

@ Random832, iyi nokta!
Bruno,

2

Ne yazık ki, örneğin:

execindirectory -d /var/log "cp *.log ~/Desktop"

dirde bir değişikliğe gerek yok çünkü

cp /var/log/*.log ~/Desktop

aynısını yapardı. Gerçek problemine daha yakın olamaz mısın? Çünkü bunun için daha iyi bir çözüm biliyor olabiliriz.

Michaels çözümünün zarafetinden çok uzakta olan probleminizi çözmenin karmaşık bir yolu, bir dosyanın bulunduğu dizinde gerçekleştirilecek '-execdir' anahtarına sahip olan bir bulgunun kullanılmasıdır. Örneğinize kötü bir şekilde uyarlandı:

find /var/log -maxdepth 1 -type f -name "*.log" -execdir echo cp {} ~/Desktop ";"

Belki de gerçek problemin için faydalıdır. -execdir yerine -okdir sizden her başvuruyu onaylamanızı isteyecektir.

-okdir ve -execdir, genellikle Linux'ta kullanılan gnu-find komutuna ihtiyaç duyabilir.


1

Ne dersiniz ./your/path/command.sh?


Hayır, aslında aşağıdaki gibi bir anlamı: execindirectory -d /var/log "cp *.log ~/Desktop".
Naftuli Kay

Bunun kesinlikle gerekli olmadığının farkındayım, bu arada, gerçekten yapılabilirse ilgileniyorum.
Naftuli Kay
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.