Jak mogę uzyskać konkretny argument z poprzedniego polecenia w bash?

31

W bashu możesz użyć !*wszystkich argumentów z poprzedniego polecenia. Na przykład, jeśli zrobiłeś, cp /some/path /some/other/patha następnie zrobiłeś mv !*, drugie polecenie zostanie rozszerzone do mv /some/path /some/other/path.

Czy istnieje coś takiego, aby uzyskać dostęp do konkretnego argumentu z polecenia zamiast wszystkich?

Wuffers
źródło

Odpowiedzi:

38

W !*, !jest historia ekspansja prefiks, i *to słowo desygnator Oznacza wszystkie argumenty. Możesz zapamiętać ogólną składnię jako bang-line-colon-column ( !line line :). Istnieje wiele możliwych skrótów: domyślną linią jest poprzednia linia, domyślnym specyfikatorem kolumny jest „wszystkie”, i można zrezygnować z dwukropka, jeśli specyfikator kolumny nie jest numeryczny (ale !3oznaczałby linię 3). Można używać !:0w odniesieniu do nazwy polecenia !:1, !:2itp, aby odnieść się do kolejnych argumentów !:$do ostatniego słowa, !:*dla wszystkich argumentów i więcej.

Zobacz także ten post Michaela Mrożka z Unix Stack Exchange .

Gilles „SO- przestań być zły”
źródło
1
Sam tego spróbowałem i to jednak nie zadziałało. Po patrząc na stanowisku Michale Mrożka, to mówi się stosowanie !:1, !:2. Po użyciu wersji z dwukropkami działało.
Wuffers
@MrMan: Ups, tak, jeśli pominiesz dwukropek za pomocą liczby, liczba jest interpretowana jako numer linii. Przepraszam za to.
Gilles „SO- przestań być zły”
Nie ma problemu. Więc zakładam, że to !1:1oznaczałoby pierwszy argument pierwszego wiersza?
Wuffers
4

Osobiście nie podoba mi się ta funkcja „rozszerzenia z wykrzyknikiem”, która będzie nawet przeszkadzać, jeśli spróbujesz echo "Hello World!"w interaktywnych powłokach (więc skrypty źródłowe, które zakładają, że będą uruchamiane w trybie nieinteraktywnym, w ogóle nie będą działać).

Tak więc ustawiam set +o histexpandi zaczynam przywoływać argumenty za pomocą następującej metody:

Esc, 1, Esc, Ctrl-Y => Insert first argument of previous command.

Zauważ, że Esc-trick jest taki, że nie mam meta-klucza.

Benoit
źródło
Prawie nigdy nie używam wykrzykników w poleceniach. Tak więc metoda wykrzyknika działa dla mnie idealnie.
Wuffers
Ciesz się tym. Wiele z licznych funkcji powłoki zaprojektowano tylko dla kilku użytkowników.
Benoit,
W rzeczywistości nie musisz uciec wykrzyknikom. Zrobić echo 'Hello, orld!'. Zwróć uwagę na pojedyncze cudzysłowy zamiast podwójnych.
Wuffers