Há muita coisa acontecendo nesse fragmento de código. Trabalhando de dentro para fora:
which voltdb 2> /dev/null
- O comando executado aqui é which
. which
como invocado, irá procurar todas as entradas na variável de ambiente PATH
para encontrar um comando chamado "voltdb". Se encontrar um arquivo executável chamado "voltdb" em um dos diretórios nomeados em PATH
, ele imprimirá o nome completo do arquivo executável voltdb
.
Para responder ao seu # 1, o "2 >" é um exemplo de redirecionamento. Todo processo Unix / Linux / * BSD possui 3 entradas e saídas padrão, 0 é stdin, 1 é stdout, 2 é stderr. Programas destinados a executar na linha de comando normalmente imprimem mensagens de erro para stderr. Então, "2 > / dev / null" não está comparando numericamente 2 com "/ dev / null", ele está enviando qualquer saída de erro which
para /dev/null
, um arquivo especial que apenas come qualquer entrada e devolve 0 bytes de saída.
Fora isso, a construção $(...)
significa "execute o comando incluído e substitua lexicamente qualquer saída aqui, entre '$ (' e ')'". Essa é a substituição de saída, algo que os programas shell fazem.
Fora da substituição de saída, o fragmento faz if [ -n "something" ];
, onde "algo" é o que which
teria impresso. O "if" é uma construção de fluxo de controle do shell, fazendo com que um bloco de código seja executado quando o pipeline de comandos após o "if" sair com um status de "sucesso".
O [
é realmente um executável, que examina os argumentos da linha de comando até o ]
. O sinalizador "-n" geralmente significa "true no próximo argumento de comprimento de cadeia não zero". Essa é a resposta para suas perguntas # 2 e # 3. A construção [ ... ]
fornece respostas verdadeiras (saída com código de sucesso) ou falsas (saída com código de falha) para algumas condições lógicas, neste caso "comprimento de cadeia diferente de zero".
voltdb
.