W tym konkretnym przypadku chciałbym dodać potwierdzenie w Bash dla
Jesteś pewny? [T / n]
dla Mercurial's hg push ssh://[email protected]//somepath/morepath
, który jest właściwie pseudonimem. Czy istnieje standardowe polecenie, które można dodać do aliasu, aby to osiągnąć?
Powodem jest to hg push
i hg out
może brzmieć podobnie, a czasami, kiedy chcę hgoutrepo
, mogę przypadkowo pisać hgpushrepo
(oba są pseudonimami).
Aktualizacja: jeśli może to być coś w rodzaju wbudowanego polecenia z innym poleceniem, takim jak: confirm && hg push ssh://...
byłoby świetnie ... tylko polecenie, które może poprosić o a yes
lub no
kontynuować resztę, jeśli yes
.
bash
alias
confirmation
niepolarność
źródło
źródło
info bash
: „W prawie każdym celu funkcje powłoki są lepsze niż aliasy”.ls -l
lubrm -i
?alias rm='rm -i'
. Pewnego dnia, gdy będziesz go najbardziej potrzebować, nie będzie tam aliasu iboom!
coś ważnego zostanie utracone.rm -i
, nie możesz liczyć na skrypt powłoki. Więc zawsze piszesz zarm -i
każdym razem?rm
i oczekiwania na-i
zachowanie, wtedy pewnego dnia aliasu nie ma (z jakiegoś powodu jest on rozbrojony lub nie jest ustawiony lub jesteś w innym systemie ) i piszesz,rm
a następnie natychmiast usuwa rzeczy bez potwierdzenia. Ups! Jeśli jednak użyjesz aliasu takiego jakalias askrm='rm -i'
wtedy, wszystko będzie w porządku, ponieważ pojawi się błąd „nie znaleziono polecenia”.Odpowiedzi:
Są to bardziej kompaktowe i wszechstronne formy Hamisha odpowiedź . Obsługują dowolną kombinację wielkich i małych liter:
Lub, dla Bash> = wersja 3.2:
Uwaga: Jeśli
$response
jest pusty ciąg, spowoduje błąd. Aby to naprawić, wystarczy dodać cudzysłów:"$response"
. - Zawsze używaj podwójnych cudzysłowów w zmiennych zawierających ciągi znaków (np .: wolisz używać"$@"
zamiast tego$@
).Lub Bash 4.x:
Edytować:
W odpowiedzi na twoją edycję, oto jak stworzysz i użyjesz
confirm
polecenia opartego na pierwszej wersji w mojej odpowiedzi (działałoby podobnie z pozostałymi dwoma):Aby użyć tej funkcji:
lub
źródło
not equal to
drugi przykład, powinieneś rzucić$response
zmienną. Npif [[ ! $response =~ ^([yY][eE][sS]|[yY])$ ]]
. :=~
jest operatorem dopasowania wyrażenia regularnego.Oto z grubsza fragment, który chcesz. Pozwól mi dowiedzieć się, jak przekazać argumenty.
Uważaj na
yes | command name here
:)źródło
Potwierdzenia można łatwo ominąć przy zwrotach karetki i uważam, że warto stale pytać o prawidłowe dane wejściowe.
Oto funkcja ułatwiająca to. „nieprawidłowe wejście” pojawia się na czerwono, jeśli Y | N nie zostanie odebrane, a użytkownik zostanie ponownie zapytany.
Możesz zmienić domyślny monit, przekazując argument
źródło
Aby uniknąć jawnego sprawdzania tych wariantów „tak”, można użyć operatora wyrażeń regularnych bash „= ~” z wyrażeniem regularnym:
To sprawdza, czy dane wejściowe użytkownika zaczynają się od „y” czy „Y”, po których następuje zero lub więcej „es”.
źródło
Może to być hack:
jak w pytaniu W Unix / Bash, czy „xargs -p” jest dobrym sposobem na monitowanie o potwierdzenie przed uruchomieniem jakiegokolwiek polecenia?
możemy użyć
xargs
do wykonania pracy:oczywiście będzie to ustawione jako alias
hgpushrepo
Przykład:
źródło
Dodaj następujące elementy do pliku / etc / bashrc. Ten skrypt dodaje rezydentną „funkcję” zamiast aliasu zwanego „potwierdzeniem”.
źródło
$response
i$@
aby uniknąć pomyłek, jest trochę redundantnych średników, a*
warunek powinien powrócić, a nie wyjść.To może być trochę za krótkie, ale na własny użytek działa świetnie
The
read -n 1
prostu czyta jedną postać. Nie musisz naciskać Enter. Jeśli nie jest to „n” ani „N”, przyjmuje się, że jest to „Y”. Samo naciśnięcie enter również oznacza Y.(co do prawdziwego pytania: zrób skrypt bashowy i zmień swój alias, aby wskazywał na ten skrypt zamiast na to, co wskazywał wcześniej)
źródło
źródło
Nie trzeba naciskać Enter
Oto dłuższe, ale wielokrotnego użytku i modułowe podejście:
0
= tak i1
= niezsh
i dlabash
.Domyślnie „nie” po naciśnięciu Enter
Zauważ, że
N
jest on kapitałowany. Tutaj naciśnij klawisz Enter, przyjmując wartość domyślną:Pamiętaj też, że
[y/N]?
został on automatycznie dołączony. Domyślne „nie” jest akceptowane, więc nic nie jest powtarzane.Powtórz monit, dopóki nie zostanie udzielona poprawna odpowiedź:
Domyślnie „tak” po naciśnięciu Enter
Pamiętaj, że
Y
wielkie litery:Powyżej po prostu nacisnąłem Enter, więc polecenie zostało uruchomione.
Brak domyślnego włączenia enter- wymaga
y
lubn
Tutaj
1
lub false został zwrócony. Uwaga: brak wielkich liter w[y/n]?
Kod
źródło
Oto moja wersja
confirm
, zmodyfikowana z Jamesa:Są to następujące zmiany:
local
do zapobiegania kolizji nazw zmiennychread
użyj,$2 $3 ...
aby kontrolować jego działanie, więc możesz użyć-n
i-t
read
zakończy się niepowodzeniem,echo
linia piękna dla urodyGit on Windows
tylko mabash-3.1
i nie matrue
lubfalse
, więc użytkowaniareturn
zamiast. Oczywiście jest to również zgodne z bash-4.4 (obecnym w Git dla Windows).źródło
Ta wersja pozwala mieć więcej niż jedną skrzynkę
y
lubY
,n
lubN
Opcjonalnie: Powtarzaj pytanie, dopóki nie zostanie udzielone pytanie zatwierdzające
Opcjonalnie: zignoruj każdą inną odpowiedź
Opcjonalnie: Wyjdź z terminalu, jeśli chcesz
Zauważ też: w ostatnim wierszu tej funkcji wyczyść zmienną REPLY. W przeciwnym razie, jeśli
echo $REPLY
zobaczysz, że jest nadal ustawiony, dopóki nie otworzysz lub nie zamkniesz terminalu ani nie ustawisz go ponownie.źródło
Późno do gry, ale stworzyłem jeszcze jeden wariant
confirm
funkcji poprzednich odpowiedzi:Aby go użyć:
Cechy:
Robaki:
echo -en
działa z,bash
ale może zawieść w twojej powłoceecho
lubxargs
źródło
Próbować,
źródło
To nie jest dokładnie „prośba o tak lub nie”, ale tylko hack: pseudonim „
hg push ...
nie do,hgpushrepo
ale do”hgpushrepoconfirmedpush
i zanim zdołam to przeliterować, lewy mózg dokonał logicznego wyboru.źródło
TAB
klucza!Nie to samo, ale pomysł, który i tak działa.
Wyjście:
Znowu? T / n N
Znowu? T / n Coś
jeszcze? T / n 7
Znowu? T / n i
ponownie? T / n nsijf
$
Teraz sprawdza tylko pierwszy znak $ i przeczytałem.
źródło
Poniższy kod łączy dwie rzeczy
shopt -s nocasematch, który zajmie się rozróżnianiem wielkości liter
a jeśli warunek, który zaakceptuje oba dane wejściowe albo przejdziesz tak, tak, tak, y.
shopt -s nocasematch
if [[sed-4.2.2. $ LINE = ~ (tak | y) $]]
następnie wyjdź 0
fi
źródło
Oto moje rozwiązanie, które używa zlokalizowanego wyrażenia regularnego. Tak więc w języku niemieckim również „j” dla „Ja” byłoby interpretowane jako tak.
Pierwszym argumentem jest pytanie, czy drugim argumentem jest „y” niż odpowiedź domyślna tak, w przeciwnym razie odpowiedź nie byłaby domyślna. Zwracana wartość to 0, jeśli odpowiedź brzmiała „tak” i 1, jeśli odpowiedź brzmiała „nie”.
Oto podstawowe zastosowanie
źródło