Nesse caso em particular, gostaria de adicionar uma confirmação no Bash para
Você tem certeza? [S / n]
para o Mercurial hg push ssh://[email protected]//somepath/morepath
, que na verdade é um apelido. Existe um comando padrão que pode ser adicionado ao alias para alcançá-lo?
A razão é que hg push
e hg out
pode soar semelhante e, por vezes, quando eu quero hgoutrepo
, eu posso accidentlly tipo hgpushrepo
(ambos são aliases).
Atualização: se pode ser algo como um comando interno com outro comando, como: confirm && hg push ssh://...
isso seria ótimo ... apenas um comando que pode pedir um yes
ou no
e continuar com o restante se yes
.
bash
alias
confirmation
falta de polaridade
fonte
fonte
info bash
: "Para quase todos os propósitos, as funções do shell são preferidas aos aliases."ls -l
ourm -i
?alias rm='rm -i'
. Um dia, quando você mais precisar, o alias não estará lá eboom!
algo importante será perdido.rm -i
, também não poderá contar com um script de shell. Então você sempre digita semprerm -i
?rm
e esperar o-i
comportamento; então, um dia o alias não estará lá (por algum motivo, ele fica desativado ou não está definido ou você está em um sistema diferente ) e você digitarm
e, em seguida, ele exclui imediatamente as coisas sem confirmação. Opa! No entanto, se você criou um alias como essealias askrm='rm -i'
, estaria bem, pois receberia um erro "comando não encontrado".Respostas:
Essas são formas mais compactas e versáteis da resposta de Hamish . Eles lidam com qualquer mistura de letras maiúsculas e minúsculas:
Ou, para o Bash> = versão 3.2:
Nota: Se
$response
for uma sequência vazia, ocorrerá um erro. Para corrigir, basta adicionar aspas:"$response"
. - Sempre usar aspas duplas em variáveis que contêm cadeias (por exemplo: preferem usar"$@"
em vez$@
).Ou, Bash 4.x:
Editar:
Em resposta à sua edição, veja como você criaria e usaria um
confirm
comando com base na primeira versão da minha resposta (funcionaria da mesma forma com as outras duas):Para usar esta função:
ou
fonte
not equal to
o segundo exemplo, deve converter a$response
variável. Por exemplo:if [[ ! $response =~ ^([yY][eE][sS]|[yY])$ ]]
.=~
é o operador de correspondência regex.Aqui está aproximadamente um trecho que você deseja. Deixe-me descobrir como encaminhar os argumentos.
Cuidado com
yes | command name here
:)fonte
As confirmações são facilmente ignoradas com retornos de carro, e acho útil solicitar continuamente a entrada válida.
Aqui está uma função para facilitar isso. "entrada inválida" aparece em vermelho se Y | N não for recebido e o usuário for solicitado novamente.
Você pode alterar o prompt padrão passando um argumento
fonte
Para evitar a verificação explícita dessas variantes de 'yes', você pode usar o operador de expressão regular do bash '= ~' com uma expressão regular:
Isso testa se a entrada do usuário começa com 'y' ou 'Y' e é seguida por zero ou mais 'es'.
fonte
Isso pode ser um hack:
como em questão No Unix / Bash, o "xargs -p" é uma boa maneira de solicitar confirmação antes de executar qualquer comando?
podemos usar
xargs
para fazer o trabalho:claro, isso será definido como um alias, como
hgpushrepo
Exemplo:
fonte
Adicione o seguinte ao seu arquivo / etc / bashrc. Este script adiciona uma "função" residente em vez de um alias chamado "confirm".
fonte
$response
e,$@
para evitar erros de interpretação, existem alguns pontos e vírgulas redundantes e a*
condição deve retornar, e não sair.Pode ser um pouco curto demais, mas para meu uso particular, ele funciona muito bem
O
read -n 1
apenas lê um personagem. Não há necessidade de pressionar enter. Se não for um 'n' ou 'N', presume-se que seja um 'Y'. Pressionar enter também significa Y.(quanto à pergunta real: torne esse script bash e altere seu alias para apontar para esse script em vez do que estava apontando antes)
fonte
fonte
Não é necessário pressionar pressionar
Aqui está uma abordagem mais longa, mas reutilizável e modular:
0
= sim e1
= nãozsh
ebash
.O padrão é "não" ao pressionar enter
Observe que o
N
capital é maiúsculo. Aqui, enter é pressionado, aceitando o padrão:Observe também que
[y/N]?
foi anexado automaticamente. O padrão "não" é aceito, então nada é ecoado.Solicite novamente até que uma resposta válida seja fornecida:
O padrão é "yes" ao pressionar enter
Observe que o
Y
é maiúsculo:Acima, eu apenas pressionei enter, então o comando foi executado.
Nenhum padrão ativado enter- requer
y
oun
Aqui,
1
ou false foi retornado. Observe que não há letras maiúsculas em[y/n]?
Código
fonte
Bem, aqui está a minha versão
confirm
, modificada da de James:Essas mudanças são:
local
para impedir que nomes de variáveis colidamread
use$2 $3 ...
para controlar sua ação, para que você possa usar-n
e-t
read
sair sem êxito,echo
um feed de linha para belezaGit on Windows
único tembash-3.1
e não temtrue
oufalse
, então use-oreturn
. Obviamente, isso também é compatível com o bash-4.4 (o atual no Git for Windows).fonte
Esta versão permite que você tenha mais de um caso
y
ouY
,n
ouN
Opcionalmente: repita a pergunta até que uma pergunta de aprovação seja fornecida
Opcionalmente: ignore qualquer outra resposta
Opcionalmente: saia do terminal se desejar
Observe também: Na última linha desta função, limpe a variável REPLY. Caso contrário, se você
echo $REPLY
ver que ele ainda está definido até você abrir ou fechar o terminal ou configurá-lo novamente.fonte
Tarde para o jogo, mas criei outra variante das
confirm
funções das respostas anteriores:Para usá-lo:
Recursos:
Insetos:
echo -en
funciona combash
mas pode falhar no seu shellecho
ouxargs
fonte
Experimentar,
fonte
Isso não é exatamente um "pedido de sim ou não", mas apenas um truque: aliás o
hg push ...
não,hgpushrepo
mas parahgpushrepoconfirmedpush
e quando eu puder explicar tudo, o cérebro esquerdo fez uma escolha lógica.fonte
TAB
chave!Não é o mesmo, mas a idéia que funciona de qualquer maneira.
Saída:
Novamente? S / n N
novamente? S / N Alguma coisa de
novo? S / n 7 de
novo? S / N &
novamente? S / n nsijf
$
Agora apenas verifica o primeiro caractere de $ i read.
fonte
O código abaixo está combinando duas coisas
shopt -s nocasematch que cuidará de maiúsculas e minúsculas
e se a condição que aceitar a entrada for aprovada, sim, Sim, SIM, y.
shopt -s nocasematch
se [[sed-4.2.2. $ LINE = ~ (sim | y) $]]
então saia 0
fi
fonte
Aqui está a minha solução que usando regex localizado. Assim, também em alemão "j" para "Ja" seria interpretado como sim.
O primeiro argumento é a pergunta, se o segundo argumento for "y" que sim, seria a resposta padrão, caso contrário, não seria a resposta padrão. O valor de retorno é 0 se a resposta for "sim" e 1 se a resposta for "não".
Aqui está um uso básico
fonte