AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1405106
Accepted
Natan
Natan
Asked: 2022-04-28 13:46:55 +0800 CST2022-04-28 13:46:55 +0800 CST 2022-04-28 13:46:55 +0800 CST

Quais são as diferenças entre o script de shell e a execução no shell que levam a esse comportamento diferente?

  • 772

No terminal xfce4 eu executo:

if [[ $(pgrep -x xfce4-terminal) ]]; then         echo "there are files" > test.txt;     else         echo "no files found" > test.txt;     fi

que escreve there are filesem test.txt. Se eu executar a mesma coisa em um script de shell, chamado enquanto o xfce4-terminal ainda estiver aberto, ele escreverá: no files foundno test.txt:

if [[ $(pgrep -x xfce4-terminal) ]]; then         echo "there are files" > test.txt;     else         echo "no files found" > test.txt;     fi

Por que esse é o caso e o que eu tenho que fazer para corrigir (fazer o script de shells se comportar como o shell) isso?

Verificando$(pgrep -x xfce4-terminal)

Do Terminal:

echo $(pgrep -x xfce4-terminal) > toast.txt
# 8257

Do script de shell:

echo $(pgrep -x xfce4-terminal) > toast.txt
# 8257
command-line
  • 2 2 respostas
  • 43 Views

2 respostas

  • Voted
  1. Best Answer
    steeldriver
    2022-04-28T14:46:21+08:002022-04-28T14:46:21+08:00

    A [[ ... ]]construção de teste estendida apareceu primeiro kshe foi posteriormente copiada por outros shells, incluindo bashe zsh.

    Se você tentar usá-lo em um shell POSIX simples /bin/sh(talvez porque você omitiu o shebang, por exemplo - consulte Qual interpretador de shell executa um script sem shebang? ) resultará em um erro de sintaxe - e isso fará com que uma ifcondição falhe independentemente da veracidade do teste. Por exemplo:

    $ bash -c 'if [[ 1 -eq 1 ]]; then echo "equal"; else echo "not equal"; fi'
    equal    
    

    mas

    $ sh -c 'if [[ 1 -eq 1 ]]; then echo "equal"; else echo "not equal"; fi'
    sh: 1: [[: not found
    not equal
    

    No entanto , [[ $(pgrep -x xfce4-terminal) ]]não é uma prática recomendada para testar se há um processo em execução chamado xfce4-terminal, mesmo quando o shell o suporta. Em vez de usar uma substituição de comando $(...)para capturar a saída padrão do pgrepcomando e testar se é uma string não vazia, você pode usar o status de saídapgrep diretamente. De man pgrep:

    EXIT STATUS
           0      One  or  more  processes  matched  the  criteria.  For pkill the
                  process must also have been successfully signalled.
           1      No processes matched or none of them could be signalled.
           2      Syntax error in the command line.
           3      Fatal error: out of memory etc.
    

    Então

    if pgrep -x xfce4-terminal >/dev/null; then
      echo "there are files" > test.txt 
    else  
      echo "no files found" > test.txt
    fi
    

    que funcionará em qualquer shell do tipo Bourne (sh, ksh, bash, zsh).

    • 3
  2. Esther
    2022-04-28T14:02:32+08:002022-04-28T14:02:32+08:00

    Na versão do terminal, você tem [[ ]], que avalia seu conteúdo e retorna um status de saída 0 se o conteúdo for válido e 1 caso contrário. Se for passado apenas uma string, ele retornará 0 se a string tiver comprimento > 0 e 1 caso contrário. Como seu comando encontrou algo, ele retorna uma string com comprimento > 0 e [[ ]]retorna um status de 0, ou 'true'.

    ifem scripts de shell usa o valor de retorno da ifinstrução para determinar se deve ser executado thenou else. Se o valor de retorno for 0, ele executa then, caso contrário, pula para else.

    No entanto, se você marcar man pgrep, ele retornará o código de saída 1 para "um ou mais processos corresponderam aos critérios". Portanto, ifvê-lo como saindo com um código de erro diferente de zero e pula para o arquivo else.

    Para corrigir isso, basta colocar [[ ]]a versão do shell script também.

    • 0

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve