fc
to polecenie wbudowane w powłokę bash, przeznaczone do edycji i ponownego uruchamiania poleceń historii.
Jest także obecny w CygWin i działa na wszystkich dystrybucjach Linuksa, na których testowałem:
fc -s '\'='/' -1
Kilka wyjaśnień
fc
jest wbudowanym poleceniem bash do wyświetlania lub edycji i ponownego uruchamiania poleceń z listy historii.
-1
podejmie ostatnie polecenie w historii. Zauważ, że nawet !!
jest zdefiniowane (odczytywane z man bash
) jako
!! Refer to the previous command. This is a synonym for
! -1 ”.
-s
aby zastąpić wzór innym. Tym razem od help fc
(wbudowane polecenie więc help
):
W formacie `fc -s [pat = rep ...] [polecenie] 'POLECENIE jest ponownie wykonywane po wykonaniu podstawienia OLD = NOWOŚĆ.
Ok, mają na myśli pat=rep
zamiast OLD=NEW
...
- Wzory zostaną odczytane przez powłokę, więc musimy je chronić cytatem:
'\'
i '/'
.
Kilka słów więcej o tym, dlaczego otrzymujesz „podstawienie nie powiodło się”
Wydaje się, że dla s
modyfikatora nie jest (jeszcze) zaimplementowane podstawienie znaku odwrotnego ukośnika \
, to znaczy ucieczki. Dla pewności powinniśmy zobaczyć kod, na przykład, wersji gnu rozszerzenia historii bash (ale było powyższe polecenie, aby uzyskać to, co próbujesz zrobić ... więc leniwie to robię ...).
Niektóre uwagi:
Jesteśmy przekonani, że będzie działać z każdym RegEx, z którym współpracujemy sed
, ale nie jest to gwarantowane. Odwrotny ukośnik jest znakiem ucieczki rozszerzenia i problem jest tutaj. Ponadto zachowanie rozszerzenia jest powiązane z shopt
opcjami, więc powinniśmy zacząć widzieć przypadek po przypadku ...
Po wklejeniu łańcucha cd C:\Foo\Bar
do powłoki bash zostanie on rozwinięty i pojawi się dla interpretera jako cd C:FooBar
; w tej formie będzie również przechowywany w $_
zmiennej wewnętrznej.
Jeśli zamiast tego wkleiłeś cd "C:\Foo\Bar"
lub cd 'C:\Foo\Bar'
w $_
zmiennej powinieneś znaleźć C:\Foo\Bar
.
Ponieważ ekspansja Historii jest wykonywana natychmiast po przeczytaniu pełnego wiersza, zanim powłoka podzieli go na słowa, możesz mieć pokusę, aby zacząć używać go z mniej lub bardziej oczywistym bazizmem , np. Z pewną pochodną (być może dodając :p
lub :q
, ""
, parsowanie i tak dalej ...)
!!:0 ${_//\\/\/}
To jest moment, aby pamiętać, że nie jest bezpiecznie zaczynać grę ścieżką i nazwami plików , szczególnie jeśli pochodzą one ze schowka systemu Windows (przeczytaj ogólnie stronę Dlaczego nie parsować ls
?) , Jest to zasadniczo związane z możliwością użycia tabulacji, spacje i znaki nowej linii jako poprawne znaki dla nazw plików i katalogów ...).
Ponadto po wklejeniu tekstu przechwyconego myszą możesz również wkleić wiodące miejsce. Dzięki temu twoje polecenie zakończy się w historii (zależy to od opcji powłoki ...). Jeśli tak, twoje !!
obserwacje będą niekontrolowanym poleceniem ... (zobacz przykład w innej odpowiedzi ).Jest to niepotrzebne namacalne ryzyko .
Wniosek
Rozszerzenia historii wprowadzają słowa z listy historii do strumienia wejściowego, ułatwiając powtarzanie poleceń, wstawianie argumentów do poprzedniego polecenia w bieżącym wierszu wprowadzania lub szybkie naprawianie błędów w poprzednich poleceniach.
Jeśli nie jest to łatwe, zaczynam myśleć, że robimy coś złego ;-)
Ad nauseam: mały eksperyment
Włączyłem wtedy histverify
w powłoce ...
shopt -s histverify
echo C:\Foo\Bar
!!:s|C|D| {1,2}A
następnie naciskam Enteri jako zweryfikowane rozszerzenie znajduję
echo D:\Foo\Bar {1,2}A
potem Enterponownie naciskam i echo
D:FooBar 1A 2A
To wydaje się wskazywać, że substitution failed
jest generowane w rozszerzeniu historii przetworzonym przed rozszerzeniem Brace , więc przede wszystkim i wydaje się potwierdzać, że s
modyfikator historii nie (jeszcze) przetworzył podstawienia \
znaku jako prawdziwego wyrażenia regularnego. ..
cd 'C:\foo\bar'