Bash'te tek bir ünlem işareti yazmak ne işe yarar?


20

Bash, bu sorunun yanıtlarında açıklandığı gibi geçmiş genişletmeler için ünlem işaretleri kullanır (örn. sudo !!İle önceki komut satırını çalıştırır sudo). Ancak, aşağıdaki komutu (yani tek bir ünlem işareti) çalıştıran ne açıklar hiçbir yerde bulamıyorum:

!

Hiçbir şey yazdırmıyor ve 1 ile çıkıyor gibi görünüyor, ancak bunu neden yaptığından emin değilim. Çevrimiçi ve Bash man sayfasında baktım, ancak "ayrılmış bir kelime" olmasının dışında hiçbir şey bulamıyorum - ama öyle }ve bunu çalıştırıyor:

}

bir hata yazdırır:

bash: syntax error near unexpected token `}'

1
Hiçbir şey değil. !geçmiş genişletme ifadesinin "başlangıcını" belirtir.
jordanm

Yanıtlar:


47

!Bir komutun başlangıcındaki yalnız komut veya ardışık düzenin çıkış durumunu reddeder : komut çıkarsa 0, 1(başarısız) durumuna döner ve sıfırdan çıktığı takdirde bunu 0(başarılı) bir çıkışa dönüştürür.

Bu kullanım Bash kılavuzunda belgelenmiştir:

Ayrılmış kelime '!' boru hattından önce çıkış durumu, yukarıda açıklandığı gibi çıkış durumunun mantıksal olumsuzlamasıdır.

Bir !hayır şu komutla şey ve gerçek getiri (eşdeğer yapar boş komutu geçersiz kılıyordu komutu ). Böylece true değerini false değerine çevirir ve durum 1 ile çıkar, ancak hata üretmez.:


Ayrıca, koşullu bir testi reddettikleri ve komutlarının !içinde başka kullanımları da vardır . Bunlar gördüğünüzle alakasız. Hem sorunuzda hem de bu durumlarda, tarihin genişlemesi ile ilgili değildir ve diğer terimlerden ayrıdır.test[[!


5
Gerçekte neyin çalıştırıldığını ve bunun neden dönüş kodunu açıkladığını açıklayan ilk cevap için +1 .
Jeff Schaller

11

Tek bir ünlem noktasını, bash kılavuzu bölümünde 3.2.2 Boru Hatları'nda bulabilirsiniz.

Ayrılmış kelime '!' boru hattından önce çıkış durumu, yukarıda açıklandığı gibi çıkış durumunun mantıksal olumsuzlamasıdır.

$ ! true; echo $?
1
$ ! false; echo $?
0

Ayrıca bölüm 3.2.4.2 Koşullu Yapılar

! ifade

İfade yanlışsa true.


Ayrıca bölüm 4.1 Bourne Shell Buildins

! İfade

İfade yanlışsa doğrudur.


Ayrıca, aşağıdakileri !takip etmedikçe geçmiş değiştirmeye başlayacağı da belirtilmelidir : boşluk, sekme, satır sonu, '=' veya '(' (extglob kabuk seçeneği shopt yerleşiği kullanılarak etkinleştirildiğinde).


0

Çünkü !karşılaştırmalarda kullanılır ve NOT anlamına gelir .

Örneğin:

a=3
b=2

[ $a -eq $b ] && echo "Equal"
[ ! $a -eq $b ] && echo "Not equal"
# of cause last comparison is possible to write as:
[ $a -eq $b ] || echo "Not equal"

[ $a -eq $b ]
echo $?
1
[ ! $a -eq $b ]
echo $?
0

1
Bu !, testkomut konumunda bir argüman olarak anlamlıdır (bash'ın yerleşik sürümü dahil), !komut konumunda kullanıldığında anlam değildir .
Gilles 'SO- kötü olmayı bırak'

1
! [...]Bu durumda soruyla eşleşmesi gerekir .
Michael Homer

@Gilles ve @Michael Homer ile anlaştı. Biliyordum []olduğunu test. Biraz acelem var.
Yurij Goncharuk

-2

! yerleşik komut, bir boru hattı hissini tersine çevirir.

Diğer kullanımlar:

#! yerleşik komut, komut dosyasını çalıştırmak için adlandırılmış yorumlayıcıyı çağırır.

! olay belirleyicisi, bir komut satırı sözcüğünü geçmiş değişikliği olarak işaretler

!= eşitsizlik operatörü

$! kabuk değişkeni, son arka plan komutunun işlem numarasını döndürür.


Sadece eklemek için, bir önceki komutun son kelimesini şu şekilde kullanmak için! $ Kullanabilirsiniz: ls -l /tmp cd !$ Bu sizi / tmp dizinine götürür.
Atlamalı Tavşan

-3

! ardından bir dize, belirtilen dize ile başlayan en son önceki komutu (yine de komut arabelleğinde) yürütür. Belki kabuk sadece bulundu hiçbir önceki komut <boş> ile başladı.


3
Soruda belirli bir dize olmadığını fark ettin ...?
Jeff Schaller
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.