Bir dizindeki CD diğer adı ve bir komut çağırma


21

Bir .bash_profileve 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.

  1. CD'yi bir dizine
  2. Bu dizinden bir komut çalıştırın

Yanıtlar:


26

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.shdizinde yer alan $HOME/somedirile, $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. commandkabukta 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.shbulunan $HOME/somedirile 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 PATHortam değişkeninize, örn.

PATH="$PATH:$HOME/somedir"

Şimdi script.shde $HOME/somedirsadece 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.


2
Mükemmel, kapsamlı cevap. Sadece fonksiyon tanımı sadece komutları gruplama biri yöntemini ihtiyacı ve alt kabuğa için parantezler yeterli belirtmekte fayda var: cdrun () ( cd "$1" && shift && command "$@" ).
Anthony G - Monica için adalet

2
@ AnthonyGeoghegan Ah, bu doğru. Her zaman { ... }daha uzun fonksiyonlarla tutarlılık için kullanıyorum .
Kusalananda

Bu soru-cevap durumumdan bahsediyor gibi görünüyor ve bağlamı temiz tutarken çevredeki pushdve popd(ayrıca > /dev/nullçıkış mesajlarından da kaçınmaya çalışıyorsanız) kullanımda bir gelişme olabilir !
Piz

1
@Pysis Evet, ve (cd dir && thing)kullanmaktan çok daha taşınabilir . pushdpopd
Kusalananda

@Kusalananda Gerçekten mi? En az birkaç sistemde çalýţtým.
Piz

4
alias <name-of-the-alias>='cd <the-directory> && <command>'

Bu nedenle, dizini (cd) klasöre değiştirmek /var/log/ve ardından (ls) dosyalarını listelemek istiyorsanız, .bash_profiledosyanıza aşağıdakileri ekleyebilirsiniz :

alias logs='cd /var/log/ && ls'

1

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 cdnadiren kullanılır.)


-1

Komutları noktalı virgülle ayırın, örneğin:

alias do_something='cd /tmp; ls'

8
Eğer cdbaşarısız, yanlış dizinin dizin listesi tanınacak. Burada &&yerine kullanmak daha iyidir ;.
Kusalananda

@Kusalananda haklı. Bu yanıtta
nikolas
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.