Chciałbym nieco poprawić przepływ pracy w Bash i zdaję sobie sprawę, że często chcę wykonać to samo polecenie w innym pliku wykonywalnym.
Kilka przykładów:
Git (gdzie chciałbym szybko zmienić drugie słowo):
git diff foo/bar.c
git checkout foo/bar.c
Cat / rm (gdzie należy zmienić tylko pierwsze słowo):
cat foo/is/a/very/long/path/to/bar.c
rm foo/is/a/very/long/path/to/bar.c
Wiem, że mogę trafić Ctrl+ anastępnie Delusunąć pierwsze słowo, ale zastanawiam się, czy istnieje szybszy sposób to zrobić.
Odpowiedzi:
!$
rozwija się do ostatniego słowa poprzedniego polecenia.Więc możesz zrobić:
lub:
Twoje przykłady powtarzały tylko ostatnie słowo, więc
!$
działało dobrze. Jeśli faktycznie miałeś wiele argumentów, które chciałeś powtórzyć, a chciałeś tylko zmienić pierwsze słowo, możesz użyć!*
, który rozszerzy się na wszystkie słowa poprzedniego polecenia oprócz zera.Zobacz sekcję „ROZSZERZENIE HISTORII” na
bash
stronie man. Jest tam duża elastyczność.źródło
!$
nie masz pełnej kontroli wzrokowej nad linią, którą biegniesz . Czasami może to być szkodliwe. Zwłaszcza jeśli popełnisz błąd w drukowaniu. To bierze z tego,history
co rozwinąć. Więc jeśli napiszesz ostatnie polecenie z pustą spacją na początku, prawdopodobnie to polecenie nie zakończy się w historii. Kiedy wykonasz nowe polecenie z!$
powłoką, nie pobierze parametrów z ostatniego wpisanego wiersza poleceń, ale tylko z ostatniej historii. Tutaj te same słowa.#
alboecho
więc mogę zobacz i przejdzie do historii, dzięki czemu mogę go odzyskać i uruchomić ponownie bez wyłączającego prefiksu.Ctrl+, aaby przejść do początku wiersza, a następnie Alt+, daby usunąć pierwsze słowo.
źródło
Meta+D
jest ważny tylko wtedy, gdyemacs
jest włączony (set -o emacs
domyślnie lub po prostu). Nie będzie działać w gorszym trybie edytora lub jeśliemacs
jest wyłączony.C-a
iM-d
są znacznie szybsze w pisaniu, jeśli Twoje ręce są już w pozycji do pisania.cat
i porównaj, co otrzymujesz, naciskając Dom (^[[H
tutaj) i naciskając Ctrl + a (^A
).Nie jestem pewien, czy rzeczywiście byłoby to szybsze, czy nie, ale zobacz ten artykuł, szczególnie punkt # .3:
źródło
Alt+.
Jeśli potrzebujesz tylko powtórzyć ostatnią część jednego z poprzednich poleceń, możesz użyć Alt+ ., który wklei ostatni argument pobrany z ostatniego wiersza historii.
Jeśli naciśniesz więcej niż jeden raz, zastąpi to, co właśnie wkleiłem ostatnim argumentem linii przed ...
Np. Jeśli ostatnie 2 polecenia to:
W powłoce piszę
rm
i naciskam Alt+ ., pojawi się:jeśli nacisnę ponownie Alt+ ., zamiast tego pojawi się
i tak dalej...
źródło
bash
. BTW Czy na pewno używasz bash jako powłoki ?≥
Oprócz odpowiedzi na @jjlin mogą Cię zainteresować następujące wskazówki:
$_
zawiera ostatni argument poprzedniego wiersza poleceńWięcej informacji na ten temat znajduje się w sekcji „Nazwy poleceń Readline” na stronie
bash
podręcznika.na przykład:
źródło
n
słowa w poleceniu, zn = 1
pierwszym przykładem in = 2
drugim. Odpowiedź jjlin pokazuje, jak usunąć pierwsze słowo (i przez ponowne zastosowanie skrótu, usunąć don
słów). Twoja odpowiedź zawiera kilka skrótów Bash (które są naprawdę przydatne), ale żaden z nich nie jest skutecznym sposobem na usunięcie pierwszychn
słów.$_
parametr prawdopodobnie działałby, gdyby był tylko jeden argument (tj. Jeślin = m - 1
gdziem
jest całkowita liczba argumentów). Pozostała część skrótów nie ma jednak znaczenia dla pytania.Jeśli jesteś biegły w vi, możesz aktywować wiązania vi w bash (większość powłok?) Za pomocą polecenia
set -o vi
. Następnie możesz użyć normalnych klawiszy vi do edycji polecenia. W pierwszym przykładzie możesz ^wcwusunąć „diff”, a następnie zmienić go na kasę.Być może nie warto uczyć się skrótów klawiszowych vi tylko do edycji wiersza poleceń, ale jeśli już je znasz, to fajny wzrost wydajności.
źródło
set -o vi
też żyłem! Robię to nawet w podpowiedziach bash.bindkey -v
dla zsh.Esc
0
c
w
Jest wiele sposobów na skórowanie tego kota!
Aby wymienić konkretny ciąg,
^old^new^extra
zajmie swoje poprzednie polecenie, wymieńold
sięnew
i załączaextra
. Możesz przerwać tak wcześnie, jak chcesz; np.^old
zastąpiold
pusty ciąg i doda pusty ciąg (zasadniczo usuwającold
i nie robiąc nic więcej).Szczególnie przydatny wariant tego:
Aby wymienić konkretne słowo, można użyć
!m:n-p
w odniesieniu do słówn
przezp
poleceniam
(numery stosowanie negatywnych liczyć wstecz od bieżącego polecenia). Możesz pominąć-p
część odnoszącą się do pojedynczego słowa i pominąć:m-p
część odnoszącą się do całego polecenia. Szczególne formy!!
dla!-1
,!$
dla ostatniego słowa poprzedniej komendy, a!*
dla wszystkich argumentów (ale słowo0
) z poprzedniego polecenia są dość wygodne.Często używam obu; Zsh jest tutaj szczególnie przyjemny, ponieważ naciśnięcie klawisza spowoduje rozwinięcie tajemniczych rzeczy, aby upewnić się, że masz rację.
Istnieje również wiele sposobów na zrobienie tego za pomocą edycji linii. Przeczytaj o skrótach klawiszowych twojej powłoki.
źródło
Większość programów terminalowych obsługuje ...
<Up-Arrow>
w razie potrzeby, aby ponownie wyświetlić jedną z poprzednich linii poleceń z historii.<Down-Arrow>
w razie potrzeby, aby przejść do następnej listy historii.<Left-Arrow>
w razie potrzeby, aby przesunąć kursor na koniec drugiego słowa.<Backspace>
w razie potrzeby, aby usunąć drugie słowo.<Right-Arrow>
/<Left-Arrow>
w razie potrzeby, aby zmienić położenie, aby uzyskać więcej zmian.<RETURN>
aby wykonać polecenieJeśli żądany wiersz komend nie był aktualny, wykonaj wyszukiwanie wsteczne i
<Ctrl-r>
zgodnie z opisem w pytaniu ...Czy istnieje sposób użycia ctrl-r po wpisaniu części polecenia w bash?
Następnie w razie potrzeby edytuj za pomocą klawiszy strzałek.
źródło
Co robię (Ubuntu / bash):
1)
Arrow up
hej, aby powrócić do poprzedniego polecenia2)
Home
klawisz, aby powrócić do początku3) Zmodyfikuj polecenie w razie potrzeby.
Odporne na idiotyzm i szczególnie przydatne w przypadku poleceń wieloliniowych.
źródło