Bir .bash_profile
ve bir dizi takma adım var. Şu anda bu takma adlar sadece tek bir komut yürütüyor ve oldukça kolaydı. Ancak oluşturmaya çalıştığım yeni bir takma adla iki şey yapmak istiyorum.
- CD'yi bir dizine
- Bu dizinden bir komut çalıştırın
Bir .bash_profile
ve bir dizi takma adım var. Şu anda bu takma adlar sadece tek bir komut yürütüyor ve oldukça kolaydı. Ancak oluşturmaya çalıştığım yeni bir takma adla iki şey yapmak istiyorum.
Yanıtlar:
Belirli bir çalışma diziniyle bir komut yürütmek için, genellikle
( cd directory && utility )
Parantez içindeki parantezler cd ...
, içindeki komut (lar) ın bir alt kabukta çalıştığı anlamına gelir. Alt kabuktaki çalışma dizinini değiştirmek, arama kabuğunun geçerli çalışma dizininin değiştirilmemesini sağlar; yani, bu komutu çağırdıktan sonra, yine de başladığınız dizinde bulunursunuz.
Örnek:
( cd / && echo "$PWD" ) # will output "/"
echo "$PWD" # will output whatever directory you were in at the start
Bir takma ad herhangi bir argüman alamadığından bu genel bir takma ada dönüştürülemez.
Bir İçin Belirli dizin ve fayda, tek yapabileceği
alias cdrun='( cd "$HOME/somedir" && ./script.sh )'
ancak genel durum için bir kabuk işlevi kullanmanız gerekir:
cdrun () {
( cd "$1" && shift && command "$@" )
}
veya
cdrun () (
cd "$1" && shift && command "$@"
)
Kıvrımlı parantezleri işlevin gövdesi etrafındaki parantezlerle değiştirmek, işlevin kendi alt kabuğunda yürütülmesini sağlar.
Bu şu şekilde kullanılır:
$ cdrun "$HOME/somedir" ./script.sh
hangi senaryoyu aday olacağını script.sh
dizinde yer alan $HOME/somedir
ile, $HOME/somedir
çalışma dizini olarak veya
$ cdrun / ls -l
size kök dizinin "uzun biçiminde" bir dizin listesi sunar.
Kabuk işlevi ilk bağımsız değişkenini alır ve bu dizine geçmeye çalışır. Bu işe yararsa, dizin adını konumsal parametrelerden (komut satırı bağımsız değişken listesi) çıkarır ve diğer bağımsız değişkenler tarafından verilen komutu yürütür. command
kabukta bağımsız değişkenlerini komut olarak yürüten yerleşik bir komuttur.
Değiştirilmiş bir çalışma dizini ile bir komut yürütmek istiyorsanız, tüm bunlar gereklidir . Sadece başka bir yerde bulunan bir komutu yürütmek istiyorsanız,
alias thing='$HOME/somedir/script.sh'
ama bu çalıştırmak istiyorum script.sh
bulunan $HOME/somedir
ile geçerli çalışma dizini olarak dizinde.
Çalışma dizinini değiştirmeden başka bir yerde bulunan bir komut dosyasını çalıştırmanın başka bir yolu da komut dosyasının konumunu PATH
ortam değişkeninize, örn.
PATH="$PATH:$HOME/somedir"
Şimdi script.sh
de $HOME/somedir
sadece kullanarak her yerde çalıştırılabilir mümkün olacak
$ script.sh
Yine, bu mu değil komut için çalışma dizinini değiştirin.
{ ... }
daha uzun fonksiyonlarla tutarlılık için kullanıyorum .
pushd
ve popd
(ayrıca > /dev/null
çıkış mesajlarından da kaçınmaya çalışıyorsanız) kullanımda bir gelişme olabilir !
(cd dir && thing)
kullanmaktan çok daha taşınabilir . pushd
popd
Farklı bir dizinde tek bir komut çalıştırmak için bu işlevi kullanın:
cd1 () {
if [ $# -eq 1 ]; then
command cd -- "$1"
else
( command cd -- "$1" && shift && "$@" )
fi
}
Bu işlevin bir sınırlaması, joker karakterlerin komutun çalıştığı dizine göre değil, orijinal dizine göre tamamlanmasıdır. Zsh'de daha iyisini yapmak mümkündür .
Bu işlev cd
, tek bir argümanla çağrıldığında normal gibi davranır , bu nedenle onu çağırmak isteyebilirsiniz cd
. (Bu işlev hiçbir seçeneği desteklemez, ancak cd
nadiren kullanılır.)
Komutları noktalı virgülle ayırın, örneğin:
alias do_something='cd /tmp; ls'
cd
başarısız, yanlış dizinin dizin listesi tanınacak. Burada &&
yerine kullanmak daha iyidir ;
.
cdrun () ( cd "$1" && shift && command "$@" )
.