Procurei por noop no bash (:), mas não consegui encontrar nenhuma informação boa. Qual é o objetivo exato ou o caso de uso desse operador?
Tentei seguir e está funcionando assim para mim:
[mandy@root]$ a=11
[mandy@root]$ b=20
[mandy@root]$ c=30
[mandy@root]$ echo $a; : echo $b ; echo $c
10
30
Informe-me sobre qualquer caso de uso desse operador em tempo real ou qualquer local onde seja obrigatório usá-lo.
:
built-in existe no bourne shell e no ksh, bem como no bash.:
em tldp.org/LDP/abs/html/special-chars.htmlRespostas:
Está lá mais por razões históricas. O cólon embutido
:
é exatamente equivalente atrue
. É tradicional usartrue
quando o valor de retorno é importante, por exemplo, em um loop infinito:É tradicional usar
:
quando a sintaxe do shell requer um comando, mas você não tem nada a fazer.O
:
builtin remonta ao shell Thompson , estava presente no Unix v6 .:
foi um indicador de etiqueta para agoto
declaração do shell Thompson . O rótulo pode ser qualquer texto, então:
dobrado como um indicador de comentário (se não houvergoto comment
,: comment
é efetivamente um comentário). A concha Bourne não teve,goto
mas manteve:
.Um idioma comum usado
:
é o: ${var=VALUE}
que definevar
comoVALUE
se não estavavar
definido e não faz nada se já estiver definido. Essa construção existe apenas na forma de uma substituição de variável, e essa substituição de variável precisa fazer parte de um comando de alguma maneira: um comando no-op serve muito bem.Veja também Que finalidade serve o cólon incorporado? .
fonte
#
para comentários (ou#!/bin/sh
shebangs); o:
comando introduziu comentários e ai do programador ingênuo que fez uma bela caixa de estrelas em seus comentários:: ****
(ou, pior,: * * *
).: * * *
?:
ser um comando, o shell ainda precisa processar seus argumentos antes de descobrir que os:
ignora. Principalmente, você está apenas fazendo com que o shell faça um trabalho extra ao expandir*
para uma lista de arquivos no diretório atual; na verdade, não afetará como o script funciona.set -e
. De qualquer forma, espero que todos nós podemos apenas concordar em usar#
:)while : ; do ... ; done
se quero um loop infinito rápido e sujo. (Normalmente há umasleep
no circuito, e eu digite Ctrl-C para matá-lo.)Eu o uso para instruções if quando eu comento todo o código. Por exemplo, você tem um teste:
mas você deseja comentar temporariamente tudo o que está contido em:
O que faz com que o bash dê um erro de sintaxe:
O Bash não pode ter blocos vazios (WTF). Então você adiciona um no-op:
ou você pode usar o no-op para comentar as linhas:
fonte
Se você usar
set- e
,|| :
é uma ótima maneira de não sair do script se ocorrer uma falha (isso explicitamente faz com que seja aprovado).fonte
|| :
, depois, você mesmo manipular o erro com umexit 0
comando permitirá exibir todos os stdout e stderr na janela do aplicativo durante a depuração. Considere o{ foo ... 2>&1; } || :
que é muito mais simples do que configurar traps e if-thens mais complexos.Você usaria
:
para fornecer um comando que tenha êxito, mas não faz nada. Neste exemplo, o comando "verbosidade" é desativado por padrão, configurando-o para:
. A opção 'v' ativa.fonte
$(verbosity $i)
posterior (e condicionalmente) não faz nada.Ignorar
alias
argumentosAlgumas vezes você deseja ter um alias que não leva em consideração nenhum argumento. Você pode fazer isso usando
:
:fonte
:
funciona, infelizmente. O exemplo que você forneceu parece redundante.#
#
fazer com que tudo o que vem sintaticamente depois da mesma linha seja ignorado. Isso é realmente diferente (consideremy_alias arg ; other_command
ou, inversamentemy_alias arg1 {BACKSLASH}{NEWLINE} arg2
) e provavelmente não é o que você deseja, pois pode causar erros de sintaxe (adivinhe o quewhile my_alias ; do true ; done
ou o quewhile true ; do my_alias ; done
fará).Um uso é como comentários de várias linhas ou para comentar parte de seu código para fins de teste, usando-o em conjunto com um arquivo aqui.
Não se esqueça de usar aspas
EOF
para que nenhum código interno seja avaliado, como$(foo)
. Ele também pode valer a pena usar um nome terminator intuitiva comoNOTES
,SCRATCHPAD
ouTODO
.fonte
Dois meus.
Incorporar comentários de POD
Uma aplicação bastante descolada
:
é para incorporar comentários POD em scripts bash , para que as páginas de manual possam ser geradas rapidamente. Obviamente, alguém poderia reescrever o script inteiro em Perl ;-)Ligação de Função em Tempo de Execução
Esse é um tipo de padrão de código para funções de ligação em tempo de execução. Fi, tenha uma função de depuração para fazer algo apenas se um determinado sinalizador estiver definido:
Você obtém:
fonte
Às vezes, cláusulas não operacionais podem tornar seu código mais legível.
Isso pode ser uma questão de opinião, mas aqui está um exemplo. Vamos supor que você criou uma função que funciona seguindo dois caminhos unix. Ele calcula o 'caminho de mudança' necessário para cd de um caminho para outro. Você coloca uma restrição em sua função de que os caminhos devem começar com '/' OU os dois não.
Alguns desenvolvedores desejam remover o no-op, mas isso significaria negar o condicional:
Agora - na minha opinião - não está tão claro na cláusula se as condições nas quais você deseja pular a função. Para eliminar o no-op e fazê-lo claramente, convém mover a cláusula if da função:
Parece melhor, mas muitas vezes não podemos fazer isso; queremos que a verificação seja feita dentro da função.
Então, quantas vezes isso acontece? Não muito frequentemente. Talvez uma ou duas vezes por ano. Isso acontece com bastante frequência, para que você esteja ciente disso. Não evito usá-lo quando acho que melhora a legibilidade do meu código (independentemente do idioma).
fonte
:
, deve usá-lo:
, nãotrue
na resposta. Dito isto, a maneira mais fácil para negar a condicional aqui é usar um[[ ... ]]
comando e prefixo com!
:if ! [[ ( ... && ... ) || ( ... && ... ) ]]; then
.: ${...=...}
seja indiscutivelmente menos estranho do quetrue ${...=...}
. Alguns podem preferir tambémwhile :; do
awhile true; do
concisão.Um pouco relacionado a esta resposta , acho este no-op bastante conveniente para hackear scripts poliglotas . Por exemplo, aqui está um comentário válido para o bash e o vimscript:
Certamente, podemos ter usado
true
da mesma forma, mas:
ser um sinal de pontuação e não uma palavra irrelevante em inglês deixa claro que é um símbolo de sintaxe.Por que alguém faria algo tão complicado quanto escrever um script poliglota (além de legal): isso é útil em situações em que normalmente escrevíamos vários arquivos de script em vários idiomas diferentes, com arquivo
X
referente ao arquivoY
.Em tal situação, a combinação dos dois scripts em um único arquivo poliglota evita qualquer trabalho
X
para determinar o caminho paraY
(é simplesmente"$0"
). Mais importante, torna mais conveniente mover ou distribuir o programa.Um exemplo comum. Há um problema conhecido de longa data com shebangs: a maioria dos sistemas (incluindo Linux e Cygwin) permite que apenas um argumento seja passado ao intérprete. O seguinte shebang:
disparará o seguinte comando:
e não o pretendido:
Assim, você acabaria escrevendo um script de wrapper, como:
É aqui que a poliglossia entra em cena.
Um exemplo mais específico. Certa vez, escrevi um script bash que, entre outras coisas, invocava o Vim. Eu precisava dar Vim configuração adicional, o que poderia ser feito com a opção
--cmd "arbitrary vimscript command here"
. No entanto, essa configuração foi substancial, de modo que incluir uma string seria terrível (se possível). Portanto, uma solução melhor era escrevê-lo em extenso em algum arquivo de configuração e fazer o Vim ler esse arquivo com-S "/path/to/file"
. Portanto, acabei com um arquivo poliglota bash / vimscript.fonte
Eu também usei nele scripts para definir variáveis padrão.
fonte
suponha que você tenha um comando que deseja associar ao sucesso de outro:
mas agora você deseja executar os comandos condicionalmente e deseja mostrar os comandos que seriam executados (execução a seco):
portanto, se você definir DEBUG e NOEXEC, o segundo comando nunca será exibido. isso ocorre porque o primeiro comando nunca é executado (porque NOEXEC não está vazio), mas a avaliação desse fato deixa você com um retorno de 1, o que significa que o comando subordinado nunca é executado (mas você deseja porque é uma execução a seco). Portanto, para corrigir isso, você pode redefinir o valor de saída deixado na pilha com um noop:
fonte