Zastanawiam się, czy można wykonać akcje łańcuchowe w terminalu Ubuntu, takie jak:
action 1 on objectA . then action 2 on objectA
bez konieczności powtarzania nazwy obiektu A.
Przykład:
touch file.js && openEditor "$1"
czy jakoś tak.
command-line
bash
HoCo_
źródło
źródło
&
wyśle polecenie „dotknij” w tło. Jeśli chciałeś „otworzyć edytor, jeśli dotyk się udał”, to&&
zamiast tego chceszOdpowiedzi:
Dzięki bash History Expansion możesz odwoływać się do n-tego słowa bieżącego wiersza poleceń, używając
!#:n
npźródło
GNU bash, version 4.3.48(1)-release
touch foo bar && ls -l !#:1-2
!
postać wprowadza wyrażenie rozszerzające historię, gdy jesteś w interaktywnej powłoce - jest przeznaczona do manipulowania w linii poleceń podczas pisania i jest wyłączona w skryptacharg1=file.js; touch "$arg1" && openEditor "$arg1"
Istnieje przydatny skrót do typowego przypadku użycia. W twoim przykładzie robisz:
W drugim poleceniu polega na tym, aby pisać
openEditor
(ze spacją po nim), a następnie Alt+ .. Spowoduje to wstawienie ostatniego argumentu ostatniego polecenia, którym jestfile.js
. (Jeśli z Altjakiegoś powodu to nie działa , Escpowinno również działać.)Ponieważ często „obiekt” jest rzeczywiście ostatnim argumentem poprzedniego polecenia, można go często używać. Jest łatwy do zapamiętania i szybko zintegruje się z zestawem intuicyjnie używanych skrótów powłoki.
Jest wiele rzeczy, które możesz z tym zrobić, oto szczegółowy artykuł na temat możliwości: /programming/4009412/how-to-use-arguments-from-previous-command .
Jako bonus działa to nie tylko w bash, ale we wszystkich programach, które używają libreadline do przetwarzania danych z wiersza poleceń.
źródło
Alt
i naciśnij2.
(lubEsc
,2
,Esc
,.
), aby uzyskać od drugiego do ostatniego argumentu prasowejAlt
+-
, typ2
i naciśnijAlt
+.
(lubEsc
,-2
,Esc
,.
).echo 1 2 3 4
2
3
Alt
i rodzaj2.
, naciśnij klawisz spacji, wstrzymywaniaAlt
i typ3.
- jeśli chcesz zakres, wykorzystanie Historia ekspansji:!!:2-3
.Jeśli chodzi o domyślną powłokę interaktywną
bash
i powłokę skryptowądash
, możesz użyć$_
do przywołania ostatniego argumentu ostatniego polecenia .csh i tcsh mają odwołania do historii, szczególnie dla ostatniego słowa polecenia, którego możesz użyć
!$
, a dla poszczególnych argumentów -!:<index>
:Ogólnie rzecz biorąc, po prostu lepiej przypisać cokolwiek
objectA
do zmiennej i użyć go w wielu poleceniach, pętlach itp. Alternatywnie, funkcja może być wyborem:źródło
$_
działa nieco inaczej niż!#:n
to ostatnie, które jest rozwijane przed zapisaniem polecenia w historii. Wracając do historii, nadal pokazywałoby to polecenie, a$_
czas!#:n
zostałby zastąpiony jego rzeczywistą wartością. Oba mają swoje zalety i wady.$_
należy zacytować, ponieważ w przeciwnym razie zostanie podzielony i globowany jak wszystko inne. (Po prostu tego tutaj nie widzimy, ponieważecho
łączy swoje argumenty z pojedynczą spacją.) Ale np.touch "hello there"; ls -l $_
Nie będzie działać.$_
jest to, że jest przenośny. W końcu!#:n
jest specyficzne dla basha.Odradzałbym podejście historyczne podane w odpowiedzi steeldrivera . Zależy to od stanu globalnego, który jest zawsze kruchy.
Lepiej jest zapętlić z góry wszystkie potrzebne polecenia, używając odpowiedniej zmiennej:
Generalnie problemem jest to, że Bash nie przerywa działania, gdy wystąpi awaria, tzn. Zachowuje się tak, jak
touch foo.txt; gedit foo.txt
zamiast łączenia w łańcuch&&
. Aby być bezpiecznym, możesz dodaćbreak
:źródło
Podczas gotowania jednego linijki czasami przypisuję powtarzaną rzecz do zmiennej powłoki, której używam wielokrotnie w poleceniu. Mogę przywołać i edytować go, aby użyć innego argumentu ze strzałką w górę, control + a, control + strzałka w prawo, aby zbliżyć kursor do
t=
.Pamiętaj, że ułatwia to dodanie rozszerzenia lub zmiany nazwy.
Zauważ też, że potrzebuję
;
po przypisaniu zmiennej, ponieważvar=value cmd
po prostu ustawia to jako zmienną środowiskową dla tego polecenia i nie wpływa na kontekst powłoki.źródło