izle komut takma adı genişlemesi


67

Bir watchtakma ad içeren bir komutu çalıştırırsanız takma adı genişletmez. Hem tek alıntı hem de çift tırnak işaretiyle denedim, aslında şu takma adı vererek:

# alias ll
alias ll='ls -l --color=tty'

Aşağıdaki komut başarısız olacak

# watch ll
sh: ll: command not found

Komut satırı genişletme bu durumda işe yaramaz mı?

Yanıtlar:


98

Takma adlar yalnızca ilk argüman olarak veya komutun sonunda sonunda boşluk bulunan başka bir takma adın ardından genişletilir.

bash' Den help alias:

VALUE öğesindeki boşluk bırakıldığında, sonraki kelimenin takma ad genişletilince takma ad değişimi için kontrol edilmesine neden olur.

Bunu yapmak için aşağıdakileri deneyin:

alias watch='watch '
alias ll='ls -l --color=tty'
watch ll

watchŞerit renklerinin bazı sürümlerinin varsayılan olarak, bazı sürümlerde --colorveya tuşlarını kullanarak durdurulabileceğini unutmayın -G.


1
Bu kesinlikle harika cevap! Teşekkürler ve elbette +1.
ztank1013

1
Teşekkürler ... Bunca zamandır, ben şunu kullandım: ll, 2. ctrl + alt + e, 3. tuşlarına basıp sonra da önek izle. Bu bir zaman tasarrufu.
anishsane

10
Maalesef, bu yöntemin, watchtakma adın bir sonraki kelime olması gerektiğine dair seçenekler sağlayamayacağınız bir kısıtlaması vardır , oysa watchkomutun çalıştırılmasından önce argümanlarına ihtiyaç duyar. Eğer denediysen watch -n 10 <alias>, bash diğer adı genişletmez. Bu sorunu çözmek için, hala takip eden bir boşluk ile istediğiniz seçenekleri içeren bir takma isme ihtiyacınız var (örn. `Alias ​​watch-10 = 'watch -n 10').
indiv

2

Belki görmeden önce takma adı manuel olarak genişletebiliriz?

watch $(alias ll | cut -d\' -f2)

açıklama

alias llGibi görünüyor çıktı :

$ alias ll
alias ll='ls -lAGh'

Böylece cut'in sınırını tek bir alıntı olarak ayarladık ve 2. alanı kesip bıraktık:

ls -lAGh

yani genişletilmiş takma ad. Bu daha sonra verilen argümanlar oluşturur watch.

Bunu yapmak için bir işlev yapın

function watcha {
    watch $(alias "$@" | cut -d\' -f2)
}

Sonra,

watcha ll

istediğiniz gibi çalışır. Bu korkunç ve her türlü durumda başarısız olacak. Üzgünüm.


0

Burada temel sorunun yürütülürken olduğunu düşündüm watch, argüman " sh -c" a verilir, yani takma ad ortamda lltanımlı değilse , sh(dash shell's)o zaman onu genişletmez. Fakat yanılmışım ve durum bu değil, Chris'in yukarıdaki cevabı haklı.


2
Tam olarak değil. Dene watch 'alias ll="ls -l --color=tty"; type ll; ll'.
Chris Down,

Doğrulamak için hemen yanıt için +1. Yukarıda yanılmışım.
Sachin Divekar

@ChrisDown, saatiniz " sh -c" kullansa bile , açıklamanız da geçerlidir sh. Haklı mıyım
Sachin Divekar

1
Bu, hangi kabuğun kullanıldığına bağlıdır sh. Bunun işe yaradığına dikkat edin :sh -c $'alias ll="ls -l --color=tty"\ntype ll\nll'
Chris Down

0

watchTakma adı genişletecek yeni bir etkileşimli kabuk çalıştırdınız mı :

watch -x bash -i -c ll

( -xDurdurmak için tasarlanmıştır watcho kendi bulunuyor kullanmasını sh -cbizim verilen komutu sarmak için. Biz geçmesi gerekiyor çünkü bunu istemiyoruz -iiçin shveya bashyapmak için o .bashrc okur ve adlar tanımlar etkileşimli kabuk. Sayesinde -x, izlemek yürütür exec kullanarak komut.)

Gah, aslında, bu işe yaramıyor. 'Ll' çıktısını bir kez gösterdikten sonra, 2 saniye uyuduktan sonra, iş biraz gizemli olarak arka plana alınır:

1]+  Stopped                 watch -x bash -i -c ll

Neden durdu? Açık ayraç [nereye gitti? Kahretsin, bunun harika bir cevap olacağını düşünmüştüm ama çalışmasını sağlayamıyorum.

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.