Bash için bir takma adda birden çok komut


210

Aşağıdaki iki komutu art arda çalıştıran bir diğer ad tanımlamak istiyorum.

gnome-screensaver
gnome-screensaver-command --lock

Şimdi ekledim

alias lock='gnome-screensaver-command --lock'

ama iş istasyonumu sık sık kilitlediğim için sadece bir komut yazmak daha kolay olurdu.

Yanıtlar:


390

Deneyin:

alias lock='gnome-screensaver; gnome-screensaver-command --lock'

veya

lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

.bashrc'nizde

İkinci çözüm argümanları kullanmanıza izin verir.


7
bu "function lock () {blah}" olmamalı mı?
emeraldjava

2
Argümanı nasıl geçersiniz? Değişken 'msg' değerini lock()parantez içine yerleştirmek hata syntax error near unexpected token mesajı verir. ''
geotheory

8
İşlev tanımlandıktan sonra, komut gibi davranır: bağımsız değişkenler komut satırında, boşluklarla ayrılmış durumdadır. Beyan kısmında, argüman $1, $2... fonksiyon gövdesindedir.
mouviciel

1
Params ile takma ad satırı içermediği için downvote.
Philip Rego

2
@PhilipRego - Sizden öğrenmek ve cevabınızı yükseltmekten memnuniyet duyarım.
mouviciel

79

Diğer cevaplar soruyu yeterince cevaplar, ancak örneğiniz ikinci komutun başarılı bir şekilde çıkmakta olduğuna bağlıdır. Takma adınızda kısa devre değerlendirmeyi denemek isteyebilirsiniz :

alias lock='gnome-screensaver && gnome-screensaver-command --lock'

Şimdi ilk komut başarılı olmadığı sürece ikinci komut denenmeyecektir. Kısa devre değerlendirmesinin daha iyi bir açıklaması bu SO sorusunda açıklanmaktadır .


5
Şaşırtıcı bir şekilde, bu denenmiş git fetch && git pull origin masterve yerime başkasının kadar benim için işe yaramadı &&ile ;.
hakunin

3
Muhtemelen git getirme 0'dan farklı bir şey döndürdüğü için mi?
RobAu

Yardım etti! Xubuntu 16.04.3'te benim için çalışıyor
Fernando León

Params ile takma ad satırı içermediği için downvote.
Philip Rego

18

Takma adlar, komut adlarının takma adı içindir. Bunun ötesinde her şey fonksiyonlarla yapılmalıdır.

alias ll='ls -l' # The ll command is an alias for ls -l

Takma adlar, hala orijinal adla ilişkilendirilmiş adlardır. llsadece biraz özel bir tür ls.

d() {
    if exists colordiff; then
        colordiff -ur "$@"
    elif exists diff; then
        diff -ur "$@"
    elif exists comm; then
        comm -3 "$1" "$2"
    fi | less
}

İşlev, dahili mantığı olan yeni bir komuttur. Bu sadece başka bir komutun yeniden adlandırılması değildir. Dahili işlemleri yapar.

Teknik olarak, Bash kabuk dilindeki takma adlar o kadar sınırlıdır ki, tek bir komuttan daha fazlasını içeren herhangi bir şey için son derece uygundurlar . Onları tek bir komutun küçük bir mutasyonunu yapmak için kullanın, başka bir şey değil.

Amaç, diğer komutlarda dahili olarak çözülecek bir işlem gerçekleştiren yeni bir komut oluşturmak olduğundan, tek doğru cevap burada bir fonksiyon kullanmaktır:

lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

Bunun gibi bir senaryoda takma adların kullanılması birçok soruna yol açar. Komut olarak yürütülen işlevlerin aksine, takma adlar geçerli komuta genişletilir ve bu, diğer adlarla diğer komutlarla birleştirildiğinde çok beklenmedik sorunlara yol açar. Ayrıca senaryolarda da çalışmazlar.


Cevabınızla ilgili herhangi bir örnek vermeniz en iyisi olacaktır. güncelleme bekleniyor.
Sajid Ali

1
Params ile takma ad satırı içermediği için downvote.
Philip Rego

2
@PhilipRego takma adları parametre almaz. Elmayı portakal olmadığı için aşağı oylamayın. Bunun yerine bir portakal yiyin. Cevabın çok iyi açıkladığı gibi, buradaki doğru araç takma adlar değil işlevlerdir.
lhunath

Bunun gibi parametreler demek istiyorum. Yuvalanmış tırnakları yanlış kullanıyordum. alias = "git commit -m 'init'; git push; git durumu"
Philip Rego

@PhilipRego Gerçekten bir takma ad değil, bir işlev kullanmanız gerekir. gps() { git commit -m 'init '; git push; git status; } Açıklandığı gibi, takma adlar son derece sınırlıdır, kırılgandır ve tek amacı komutları yeniden adlandırmaktır. Bunları alakasız amaçlarla kötüye kullanmak, az önce deneyimlediğiniz gibi sizi sıcak suya indirir.
lhunath

11

Bu çalışmıyor mu?

alias whatever='gnome-screensaver ; gnome-screensaver-command --lock'

4

Bu, 2 komutu art arda çalıştırır:

alias lock='gnome-screensaver ; gnome-screensaver-command --lock'

1

Bu yüzden noktalı virgül kullanın:

alias lock='gnome-screensaver; gnome-screen-saver-command --lock'

İlk komuta argüman sağlamak istiyorsanız bu işe yaramaz. Alternatif olarak, $ HOME / bin dizininizde önemsiz bir komut dosyası oluşturun.


0

11 yaşındaki tartışmaya 2 sent ekleyerek şunu deneyin:

alias lock="gnome-screensaver \gnome-screensaver-command --lock"


0

Bu işlevi kendinize ekleyin ~/.bashrcve terminalinizi yeniden başlatın veya çalıştırınsource ~/.bashrc

function lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

Bu şekilde, bu iki komut lockterminalinize her girdiğinizde çalışacaktır .

Özel durumunuzda bir aliasişe yaraması işe yarayabilir, ancak bunu önermiyorum. Sezgisel olarak, bir takma adın değerinin terminaldeki değeri girdiğiniz gibi çalışacağını düşünürüz. Ancak durum böyle değil:

Takma adların tanımı ve kullanımı ile ilgili kurallar biraz kafa karıştırıcıdır.

ve

Neredeyse her amaç için kabuk fonksiyonları takma adlara tercih edilir.

Yani gerekmedikçe takma ad kullanmayın. https://ss64.com/bash/alias.html


-3

Takma ad bildirirken bir sorunla karşılaştım ~/.bashrc. Terminalim beyan ettiğim takma adları tanımadı ~/.bashrc. Makaleden (altta ekli) Mac OS X'in login-shellvarsayılan olarak çalıştığını ve ~/.bash_profilebunun yerine çağırdığını öğrendim ~/.bashrc.

Takma adlarınızı bildirirken aynı sorunla karşılaşırsanız, sorunu çözmek için aşağıdaki bağlantıya başvurabilirsiniz:

http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html


Bu KG, takma adı nereye koyacağınız değil , takma addaki birden fazla komutla ilgilidir .
facuq

source .bashrcTakma adın oturumu kapatmadan tanınmasını sağlamak için her zaman dosyadaki değişiklikleri kaydettikten sonra gerçekleştiririm .
Scott Fleming
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.