Gravar o resultado do pipe para variável

0

Eu preciso ser capaz de escrever se o teste para um grep é TRUE ou FALSE para uma variável, para que eu possa usá-lo mais tarde

Para o seguinte, se eu correr

defaults read com.apple.Finder | grep "AppleShowAllFiles"

no meu sistema, ele retornaria

AppleShowAllFiles = FALSE;

Legal. Então agora eu quero canalizar essa resposta para um teste de algum tipo. É aqui que fico preso.

Eu acho que se eu puder canalizar / atribuir essa saída a uma variável especificada, eu seria capaz de executar um teste nela. Agora, basta dizer, eu atribuí o valor desta saída para uma variável, neste caso, vou usar $ASAF como minha variável, eu posso executá-lo em um teste como este

if [ $ASAF = "AppleShowAllFiles = TRUE;" ]; then
defaults write com.apple.Finder AppleShowAllFiles FALSE
killall Finder
else
defaults write com.apple.Finder AppleShowAllFiles True
killall Finder
fi

Se houver outra maneira de fazer isso, eu ficaria mais do que aberto a opções. Eu não tive que fazer algo assim por um tempo, e estou um pouco perplexo. Eu pesquisei o Google um pouco, mas foram todas as respostas sem explicações e usando o valor de retorno de 0 ou 1 . Eu acho que a saída retornada sendo atribuída a uma variável seria mais apropriada, pois eu posso usá-la repetidamente no script, conforme necessário.

    
por Danijel-James W 28.09.2013 / 16:31

3 respostas

1

Se você quiser apenas salvar o código de retorno (sucesso / falha) de um comando, use $? :

# grep -q to avoid sending output to 'stdout' and to stop if it finds the target.
defaults read com.apple.Finder | grep -q "AppleShowAllFiles"
NOTFOUND=$?

# Note that we use an *arithmetic* test, not a string test, and that we have to
# invert the arithmetic value.

if ((!NOTFOUND)); then
  # not NOTFOUND is FOUND
  # ...
fi

Como alternativa, você pode salvar a saída em uma variável, se, como no seu exemplo, você precisar da cadeia real. Em caso afirmativo, sua solução é razoável, mas esteja ciente de que analisar a saída de programas como defaults pode ser bastante frágil, já que pequenas alterações no formato farão com que os padrões não sejam correspondidos de repente. Tente fazer seus padrões o mais geral possível:

# Here we use the '-m1' flag to stop matching as soon as the first line matches
ASAF_STRING=$(defaults read com.apple.Finder | grep -m1 "AppleShowAllFiles")

# Try to parse true or false out of the string. We do this in a subshell to
# avoid changing the shell option in the main shell.
ASAF=$(
  shopt -s nocasematch
  case $ASAF_STRING in 
    *true*) echo TRUE;;
    *false*) echo FALSE;;
    *) echo Could not parse AppleShowAllFiles >> /dev/stderr;;
  esac
)
    
por 28.09.2013 / 17:05
1

Eu vejo duas maneiras de fazer isso, dependendo se você realmente precisa da variável mais de uma vez ou não.

Se você precisar apenas da variável uma vez, basta combinar o grep na sua instrução if, ou seja,

if defaults read com.apple.Finder | grep -q "AppleShowAllFiles" ; then ...

Ou, se você precisar usar a variável mais de uma vez, poderá fazer algo assim

defaults read com.apple.Finder | grep -q "AppleShowAllFiles"

ASAF=$? ##$? is equal to the return value of the last command

if [ "$ASAF" -eq "0"]; then ...

    
por 28.09.2013 / 17:02
1

Você não precisa usar grep :

[[ $(defaults read com.apple.finder AppleShowAllFiles)  0 ]] && bool=true || bool=false
defaults write com.apple.finder AppleShowAllFiles -bool $bool
osascript -e 'quit app "Finder";

defaults read imprime valores booleanos como 1 ou 0 .

    
por 29.09.2013 / 11:01