Mogę uzyć '!!' w aliasach lub skryptach?

10

W terminalu mogę użyć, !!który będzie odwoływał się do mojego poprzedniego polecenia.
Czy można tego użyć w aliasie? Próbowałem, ale zdarza się, że podwójne wykrzykniki są interpretowane dosłownie.

Chcę, aby możliwe było:

  1. Wprowadzam jakieś polecenie
  2. Wpisuję alias, który będzie zawierał to, co zostało wprowadzone w kroku 1

Jeśli istnieje rozwiązanie wykorzystujące skrypty, jest to również dopuszczalne.

Ludwig Magnusson
źródło
jaki jest twój główny cel? dodać więcej opcji do ostatniego polecenia?
Sergiy Kolodyazhnyy
Nie moim celem jest szybkie wpisanie długiego polecenia, którego często używam. W środku znajduje się długi ciąg, który często jest poprzednim poleceniem
Ludwig Magnusson,
wygląda na to, że potrzebujesz tylko fcpolecenia, więc otwiera edytor tekstu, ponieważ jest to najłatwiejszy sposób edytowania długich poleceń. Pozwól mi dodać go do mojego postu. A może mógłbyś podać przykład polecenia?
Sergiy Kolodyazhnyy
Dodano zmianę do mojego postu
Sergiy Kolodyazhnyy

Odpowiedzi:

11

Poleceniem wyświetlającym ostatnio wykonane polecenie jest fc -nl -1. Stosując podstawienie wyjściowe, możemy dodać więcej parametrów do tej samej treści

$> ls /etc/passwd
/etc/passwd
$> $(fc -nl -1)  /etc/group                                                     
/etc/group  /etc/passwd
$> 

Cytowanie może jednak stanowić problem w tym podejściu

Bardzo miłą cechą fcjest to, że jeśli po prostu uruchomisz fcpolecenie samodzielnie, otworzy się edytor tekstowy określony w FCEDITzmiennej (w której prawdopodobnie chcesz przechowywać ~/.bashrc), a zawartość wiersza będzie twoim ostatnim poleceniem. Dla ułatwienia sugeruję korzystanie z niego nanojako edytora tekstu, ale jeśli wiesz vim - jeszcze lepiej.

Na przykład, co jeśli muszę edytować qdbus org.ayatana.bamf /org/ayatana/bamf/matcher org.ayatana.bamf.matcher.ActiveWindowOgromną linię, prawda? Ale za pomocą fcmogę otwierać vimi edytować /org/ayatana/bamf/matcher, zapisywać, wychodzić i będzie działać.

Sergiy Kolodyazhnyy
źródło
9

Nie możesz użyć, !!ale ...

Z instrukcji :

Przydatnym aliasem używanym z poleceniem fc jest to r='fc -s', że wpisanie „r cc” uruchamia ostatnie polecenie zaczynające się na cc, a wpisanie „r” ponownie uruchamia ostatnie polecenie.

Rinzwind
źródło
To pozwoli mi dodać coś na początku mojego ostatniego polecenia. A może w środku?
Ludwig Magnusson,
8

Jeśli nalegasz na użycie !!składni ekspansji historii zamiast fc(jak już wspomniano), istnieje sposób.

Domyślnie historyrozszerzenie jest wyłączone dla nieinteraktywnych sesji powłoki, np. W skryptach.

Aby włączyć rozszerzanie historii w skryptach, najpierw włącz odpowiednie opcje powłoki:

set -o history 
set -o histexpand

set -o histexpandmożna też napisać set -H.

Teraz operacje rozszerzania historii !!mogłyby np. Działać w skrypcie.

heemayl
źródło