it-swarm-tr.com

Belirli bir dizinde cd'ing yapmadan belirli bir komut çalıştırılsın mı?

Komutu cd yapmak zorunda kalmadan farklı bir dizinde yürütmenin bir yolu var mı? Ben sadece cd in ve cd out yapabileceğimi biliyorum, ama sadece ekstra adımları atma olasılıklarıyla ilgileniyorum :)

43
Naftuli Kay

Bunun önemli olup olmadığını bilmiyorum, ancak bir alt kabuk yapabilirsiniz:

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

Dizin yalnızca bu alt kabuk için değiştirildiğinden, cd - sonradan.

56
Michael Mrozek

Bazı programlarda chdir (2) kendilerini (ör. GNU katran 'ın -C/--directory).

Bu tür programların dışında bir şey chdir gerekir. Shell'in bunu yapmak yerine bir çeşit derlenmiş “ikili” program yazabilir ve kullanabilirsiniz, ancak muhtemelen çok fazla fayda sağlamaz.

Başka bir cevabın yorumunda bir örnek verdiniz:

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

*.log Deseni Shell'in kendisi tarafından genişletildiğinden ( cp değil), Komutunuzu değerlendirmeden önce dizine chdir .

Eğer sadece “cd back” yapmaktan kaçınmak istiyorsanız, cd'nin çalışma Shell örneğinizin etkisini izole etmek için bir alt kabuk kullanabilirsiniz. .

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

Bunu bir Kabuk işlevinde paketleyebilirsiniz. (Dizin gerçekten isteğe bağlıysa bu komuta çok az nokta olduğu için, örnek kullanımınızdan -d Seçeneğini bıraktım.)

runindir() { (cd "$1" && shift && eval "[email protected]"); }

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
14
Chris Johnsen

Başkaları tarafından verilen cevapların değerini baltalamamak, ama ne istediğine inanıyorum bu:

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

Bir alt Kabukta cd öğesini çağırmak için çözüm yollarına dikkat edin.

11
alex

İşte cd bulunduğunuz yere geri dönmenizi sağlayacak bir şey (Bash kullanarak), çünkü bunu unutmamak 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: @ Random832 sayesinde biraz daha kısa versiyon)

4
Bruno

Ne yazık ki, örneğin:

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

dir'de bir değişikliğe ihtiyaç duymaz, çünkü

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

aynısını yapardı. Gerçek problemine yaklaşamaz mısın? Çünkü bunun için daha iyi bir çözüm bilebiliriz.

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

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

Belki gerçek probleminiz için yararlıdır. -execdir yerine -okdir her çağrıyı onaylamanızı ister.

-okdir ve -execdir'in yüklenmesi için genellikle Linux'ta kullanılan gnu-find gerekebilir.

2
user unknown

./your/path/command.sh?

1
bdictator