Comando não retorna valor esperado dentro de .zshrc

2

Tentando executar:

function which_terminal {
        return (ps -p$PPID | awk "'NR==2'" | cut -d "' '" -f 11)
}

dentro de .zshrc para obter um varible com qual emulador de terminal está rodando para que eu possa configurar diferentes temas para diferentes emuladores de terminal.

quando executo este comando na linha de comando, recebo exatamente o emulador sendo usado. Mas quando eu tento adicionar isso ao arquivo eu recebo um erro como:

which_terminal:1: no matches found: (ps -p16632 | awk 'NR==2' | cut -d ' ' -f 11)

não consegue encontrar onde está errado, se alguém puder ajudar

    
por Arthur Caccavo 19.06.2018 / 20:49

1 resposta

2

No shell, o valor de retorno de uma função é como o status de saída de um comando: você só pode retornar um valor inteiro pequeno indicando sucesso (0) ou um código de falha (> 0).

Este status não tem nada a ver com a saída de um comando. Para executar um comando e armazenar sua saída em uma variável, use a substituição de comando . Para executar um comando em uma função e obter sua saída como a saída da função, basta executar o comando.

function which_terminal {
    ps -p$PPID | awk "'NR==2'" | cut -d "' '" -f 11
}

Observe que a análise da saída de ps não é confiável e é excessiva. (Além disso, você entendeu errado: você está analisando 'NR==2' a awk e ' ' a cut , ambos argumentos inválidos; você precisa de aspas simples ou aspas duplas em torno de cada uma delas, não de ambas. ) O comando ps tem opções para imprimir qualquer campo que você queira, por exemplo comm para o nome do executável (truncado para 16 caracteres no Linux) ou args para a linha de comando completa com argumentos (e às vezes o caminho completo para o comando, dependendo de como ele foi chamado).

function which_terminal {
    ps -p$PPID -o comm=
}

Ou para armazenar a saída em uma variável:

parent_process_command=$(ps -p$PPID -o comm=)

A razão para o erro que você está recebendo é que o zsh está tentando analisar o que segue return como um argumento de um comando (aqui é um argumento da palavra-chave return , mas eles são analisados no mesmo caminho). Ele vê um parêntese aberto e decide que é o início de uma expressão curinga. Essa expressão curinga corresponderia a um arquivo chamado ps -p16632 , awk 'NR==2' ou cut -d -f 11 (com espaços iniciais / finais que não são renderizados aqui), mas como você (sem surpresa) não possui arquivos com nenhum desses nomes, zsh reclama que não encontrou uma correspondência. return ? retornaria 3 se você tivesse um arquivo chamado 3 no diretório atual e nenhum outro arquivo com um nome de um caractere.

    
por 19.06.2018 / 21:05