Problema de automação de script Bash

0

Estou tirando isso do contexto, mas esse trecho do meu script não é executado corretamente:

latest=$(ls ~/Videos/ -t | head -n 1 | sed 's/ /\ /g')
mpv ~/Videos/$latest

Estou tentando reproduzir automaticamente o arquivo mais recente adicionado ao meu diretório Vídeos. O seguinte erro ocorre:

Error parsing option t (option not found)
Setting command line option '--t=' failed.

Exiting... (Fatal error)
    
por fate76 18.07.2016 / 00:09

1 resposta

0

A análise da saída de ls é geralmente uma má ideia . Fazê-lo quando essa saída é uma lista de arquivos de vídeo é uma ideia absolutamente horrível. Arquivos de vídeo quase certamente conterão espaços e outros caracteres estranhos que provavelmente causarão problemas. Aqui está uma alternativa mais segura que faz a mesma coisa:

latest="$(stat --printf '%Y\t%nlatest="$(stat --printf '%Y\t%nlatest="$(stat --printf '%Y\t%nlatest="$(ls ~/Videos/ -t | head -n 1)"
mpv ~/Videos/"$latest"
' * | sort -rzk1 | perl -00pe 's/^\d+\s+(.*?)
latest="$(stat --printf '%Y\t%nlatest="$(stat --printf '%Y\t%nlatest="$(stat --printf '%Y\t%nlatest="$(ls ~/Videos/ -t | head -n 1)"
mpv ~/Videos/"$latest"
' * | sort -rzk1 | perl -00pe 's/^\d+\s+(.*?)%pre%.*/$1/s')" ' * | sort -rzk1 | awk -F'\t' -vRS='%pre%' '{print $2; exit}' ' * | sort -zk1 | tail -zn1 | cut -f2-)" mpv "$latest"
.*/$1/s')"
' * | sort -rzk1 | awk -F'\t' -vRS='%pre%' '{print $2; exit}' ' * | sort -zk1 | tail -zn1 | cut -f2-)" mpv "$latest"

Ou, se o seu tail não tiver o sinalizador -z :

%pre%

Ou

%pre%

Observe as citações. Você deve sempre citar suas variáveis a menos que você esteja absolutamente certo de que citar irá quebrar alguma coisa. Essa solução usa stat para imprimir a data de modificação do arquivo ( %Y ), uma guia ( \t ), o nome do arquivo ( %n ) e um caractere NULL ( -k1 ). Isso é alimentado para classificar o que classifica no primeiro campo ( -z ), a data e espera entrada separada por nulo ( tail ). Em seguida, ele é passado por -n1 para obter a última linha ( -z ) separada por nulo ( cut ) e, finalmente, ~/Videos remove a data deixando apenas o nome do arquivo. Isso garante que você pode lidar com arquivos arbitrários, mesmo com novas linhas em seus nomes.

O erro que você está vendo é difícil de diagnosticar sem saber os nomes dos arquivos em --t . A questão principal é que você não está citando o nome da variável e, como parece haver um arquivo com %code% , isso é considerado um argumento. Se você souber que seus nomes de arquivos nunca conterão novas linhas, também poderá fazer:

%pre%

Mas isso é realmente um mau hábito para entrar e nunca deve ser usado no código de produção.

    
por terdon 18.07.2016 / 13:24

Tags