Co oznacza! #: 3 w poleceniu powłoki

29

Przewodnik instalacyjny dla ack sugeruje instalację skryptu ack za pomocą tego polecenia:

curl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755 !#:3 

Zakładam, że !#:3na końcu jest jakiś odnośnik, ale co to znaczy? Czy istnieje odpowiednik w Zsh? Google nie był pomocny.

Matt Pfefferle
źródło
5
Zakładając uderzenie; man bash, następnie wyszukaj ROZSZERZENIE HISTORII
Jeff Schaller
1
Oznacza to, że mój kot przeszedł przez klawiaturę w bardzo złym momencie.
IQAndreas
@IQAndreas: Cóż, to prawidłowe polecenie, więc twój kot musi być wystarczająco sprytny, aby pokonać wykrywacz pisania kota . Oczywiście nie jest to bezużyteczny kot. :-) ⁠
G-Man mówi „Przywróć Monikę”

Odpowiedzi:

32

Jest to specjalna składnia, rozwinięta przez bash. Działa również dla Zsh.

Zgodnie ze stroną podręcznika bash (sekcja ROZSZERZENIE HISTORII) wzorzec rozwija się w następujący sposób:

  • Oznaczenie zdarzenia !# odnosi się do całego wpisanego do tej pory wiersza polecenia, którym jestcurl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755
  • :dzieli się między desygnatorem zdarzenia (w tym przypadku całą linię) a desygnatorem słowa (wybiera podczęść)
  • desygnator słowo 3 , które wybiera trzeci słowo / argumentów (licząc od słowa Zaczyna się od zera), w tym przypadku ~/bin/ack.

Linia komend końcowy (zwykle wyświetlane przed stracony) wynosi: curl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755 ~/bin/ack.

Aby uzyskać szczegółowe informacje, zobacz instrukcję bash lub bardzo podobny podręcznik zsh

Jofel
źródło
7
Zastanawiam się: kto pomyślał, że ta funkcja będzie dobrym pomysłem?
Rhymoid,
3
@Rhymoid, nie używam !#dużo, ale !!, !$, !*, !sud:pi wielu innych, są niezwykle przydatne i używam ich cały czas. Sprawdź unix.stackexchange.com/a/67/135943
Wildcard
11

W bashto podstawienie historii (wszystkie podstawienia historii zaczynają się od !). W szczególności !#oznacza wszystko do tej pory w wierszu polecenia, a dodanie „: 3” oznacza trzecie słowo (liczenie początkowe od 0).

Tak więc powyższe polecenie przekłada się !#:3na ~/bin/ack.

Brian
źródło