Komutu farklı bir dizinde kullanmak zorunda kalmadan yürütmenin bir yolu var mı cd
? Basitçe cd
girip çıkabileceğimi biliyorum cd
, ancak yalnızca fazladan adımları atma olasılıklarıyla ilgileniyorum :)
Komutu farklı bir dizinde kullanmak zorunda kalmadan yürütmenin bir yolu var mı cd
? Basitçe cd
girip çıkabileceğimi biliyorum cd
, ancak yalnızca fazladan adımları atma olasılıklarıyla ilgileniyorum :)
Yanıtlar:
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 .
$ (cd /var/log && cp *.log ~/Desktop)
. Bu şekilde, eğer dizin yoksa, başka bir komut yürütülmez.
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 *.log
desen 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. ( -d
Dizin 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
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])
cd
Alt kabukta çağrılacak pareleri not edin .
İşte cd
nerede 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)
pushd other-dir
yerine , sadece olabilirpushd .; cd other-dir
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.
Ne dersiniz ./your/path/command.sh
?
execindirectory -d /var/log "cp *.log ~/Desktop"
.
echo "#!/bin/bash; cd $1; exec $2" > /usr/local/bin/execindirectory; chmod +x /usr/local/bin/execindirectory
. Gibi gerçekten seçenek-d
ve "gibi" etiketleri "seçeneği desteklemek istiyorsanız, biraz daha çaba sarf etmeniz gerekebilir .