Como um arquivo final é dado como a saída de uma função find? [fechadas]

3

Sou novo em ambiente Unix. Gostaria de monitorar a saída de um cálculo em um cluster com uma função. Eu tentei esta função eu coloquei dentro do meu arquivo .bashrc sob a seção de alias:

function tj(){ 
    tail -100f $(find . -type f -name "*.o$1")
}

e depois

tj 1234

para ver o que está no arquivo dm.o1234 , mas não estou conseguindo nada que eu queira, na verdade nada (somente >).

Você tem alguma idéia de onde o (s) erro (s) está (ão)?

    
por benamoussa 09.02.2018 / 10:50

1 resposta

5

Ele não sabe qual é a origem exata do seu problema, mas seu código está em um território não especificado aqui.

  • function tj() não é uma sintaxe de definição de função padrão, nem a sintaxe Bourne / POSIX (que usa tj() ) nem a sintaxe Korn (que usa function tj sem () ). Algumas shells (bash, zsh, pdksh) suportam principalmente por acidente.
  • tail -100f não é especificado pelo POSIX. A sintaxe POSIX é tail -f -n 100
  • POSIX tail leva no máximo um argumento, o comportamento não é especificado se você passar mais de um argumento. Algumas implementações, como o GNU tail , podem assistir a mais de um arquivo em paralelo, mas muitas outras não. Você poderia tentar instalar comandos semelhantes à cauda projetados para isso como multitail
  • $(find...) chama o operador split + glob, portanto, com o valor padrão $IFS , isso não funcionaria corretamente se algum dos caminhos de arquivo contivesse espaço, tabulação, nova linha ou caracteres curinga. Se find não retornar nenhum arquivo, ele também terminará tail ing stdin.

Aqui você pode usar zsh e definir o comando como

tj() multitail ./**/*.o$1(.)

Ele relataria um erro se não houvesse nenhum arquivo correspondente (em oposição a tail ing stdin). Observe também que, ao contrário de find , ele fornece uma lista classificada de arquivos e ignora arquivos ou arquivos ocultos em diretórios ocultos (adicione o qualificador D glob, se desejar).

Agora, se, de acordo com sua edição, você ver > quando executar tj , quando > for o prompt secundário padrão ( $PS2 ), será mais provável que você tenha um alias também definido para tj (esse pseudônimo provavelmente definido após a definição da função tj ou caso contrário, isso teria causado um erro na definição da função tj ).

Por exemplo, é o tipo de coisa que você veria se tivesse executado:

alias tj='for sure'

(um loop for não terminado), ou qualquer código que não seja auto-contido e para o qual o shell emitiria um prompt secundário para você terminá-lo.

Você pode indefinir esse alias com unalias tj (e remover sua definição do seu ~/.bashrc se ele estiver lá, para que ele não volte na próxima vez que você executar bash ).

Claro, também há sempre a possibilidade de que o único arquivo *.o1234 encontrado contenha apenas > .

    
por 09.02.2018 / 11:14

Tags