Podczas, gdy Google dostosowuje mój monit powłoki za pomocą zmiennej PS1, widzę tabele znaków specjalnych, których można użyć. W szczególności:
\! the history number of this command
\# the command number of this command
Wydaje się, że „numer historii” jest częściej używany i wiem, jak używać poleceń, takich jak !523
ponawianie poleceń z historii. Ale nie mogę ustalić, czy „numer polecenia” ma podobną funkcjonalność. Próbowałem wprowadzić \#
zmienną PS1 i wydaje się, że wypisuje ona liczbę poleceń wprowadzonych w danej sesji (w przeciwieństwie do tej \!
, która utrzymuje się po wylogowaniu / wyjściu).
Czy ktoś wie, jak używać „numeru polecenia” w wygodny lub znaczący sposób?
bash
command-line
command-history
Lagrangian
źródło
źródło
Odpowiedzi:
Numer polecenia Basha służy wyłącznie do wyświetlania.
Najpierw trochę tła z
bashref
:Nurkując przez źródło,
parse.y
widzimy, że'\#'
rozwiązuje to globalna zmienna statycznacurrent_command_number
:który ma tylko jedno zastosowanie: w
eval.c
jest zwiększany po uruchomieniu polecenia:Przechowywana jest tylko liczba, a nie rzeczywiste polecenie lub nawet równoważny numer historii. Tak więc, po wykonaniu każdego polecenia, bash zapomina, które polecenie jest powiązane z danym numerem polecenia, czyniąc numer polecenia niezdatnym do użytku dla celów innych niż wyświetlanie i przewijanie.
źródło
O ile mogę powiedzieć (i to wydaje się być potwierdzone przez badania), nie ma możliwości, aby odnieść się do tej magicznej liczby interaktywnie, lub nie przez
fc
lub!n
skrótów. Wydaje się, że z pewnością odnoszą się one tylko do absolutnej pozycji na liście historii, a nie do pozycji względnej od momentu uruchomienia tej konkretnej powłoki (do której\#
odnosi się waht , jak słusznie zauważyłeś).Jedynym sposobem, aby uczynić to przyjemniejszym tutaj, jest ustawienie następujących opcji:
W ten sposób:
1000
, co ułatwia określenie, gdzie jestem w sesjiZasadniczo zmieniłem mój zmodyfikowany monit (
PS1="\\!$ "
) z:do:
... co czyni go trochę czystszym na początku. Ale prawdopodobnie nie takiej odpowiedzi szukałeś. :)
(Nawiasem mówiąc, szukałem również rozwiązania zsh i wydaje się, że po prostu nie ma ono odpowiednika
\#
, więc to też nie pomaga.)źródło