Como fazer uma função personalizada no arquivo bash

1

Eu estou procurando uma maneira de criar uma função personalizada em um dos arquivos de configuração, para que quando eu abrir uma nova sessão, a mesma função personalizada possa ser avaliada (ou originada), e eu possa usar a função facilmente .

Eu tento criar uma função para verificar se ERROR existe no meu arquivo de log, então quando eu verificar os arquivos de log, eu posso apenas digitar o nome da função e o nome do arquivo de log. Agora estou usando o grep: grep ERROR test.txt

Mas quero facilitar, porque tenho muitas dessas verificações. Então, adiciono essa linha em .bashrc :

ok(){grep ERROR $filename}

e quando eu uso a função, eu esperava digitar: ok test.txt e deveria me dar as linhas ERROR, se houver.

No entanto, depois de avaliar o arquivo .bashrc , recebi uma mensagem de erro:

-bash: .bashrc: line 16: syntax error: unexpected end of file

Depois que eu digitei: ok test.txt , ele fornece:

-bash: ok: command not found

Alguém pode me ajudar com essa função personalizada? Ou devo colar meu código em outro arquivo de configuração como .bashrc-profile ?

Muito obrigado antecipadamente!

    
por Counter10000 15.02.2018 / 21:20

2 respostas

5

O shell é muito exigente sobre a sintaxe e o espaço em branco com a construção { ... } . Essas duas maneiras de configurar essa função funcionariam:

ok() { grep ERROR $filename; }
ok() {
    grep ERROR $filename
}

Em relação às chaves { .. } vs. parêntesis ( .. ) , Bash's manual afirma que :

The semicolon (or newline) following list is required.

e

The braces are reserved words, so they must be separated from the list by blanks or other shell metacharacters.

Lista refere-se aos comandos dentro das chaves, e tudo isso se aplica onde sempre { ... } é usado, mas funções são provavelmente o lugar mais comum.

Além disso, se você quiser dar o nome do arquivo como um parâmetro para a função, use $1 dentro dele. ou seja, ok() { grep ERROR "$1"; } pode ser usado como ok test.txt .

    
por 15.02.2018 / 21:24
0

não precisa ser assim, você se sentiria livre e muito beneficiado com isso

ok() { set -f
if test -z "$2"
then
  grep -HPine "$1" -r --include=*.log --include=*.txt
else
  grep -HPine "$1" -r --include="$2"
fi
}

$ ok error test.txt
$ ok err test.txt
$ ok error
$ ok 'err|warn'
$ ok error logdata.*

o terceiro uso encontrará todas as linhas com 'erro' em todos os arquivos com extensão de log e txt em todos os diretórios no diretório atual
o quarto encontrará todas as linhas com 'error' ou 'warn' string em todos os arquivos com extensão de log e txt em todos os diretórios no diretório atual
o 5º encontrará todas as linhas com a string 'error' em todos os arquivos denominados logdata com qualquer nome de extensão em todos os diretórios no diretório atual

    
por 16.02.2018 / 00:13