Traço “-nt”

2

O caso de uso em que posso pensar em -nt seria atualizar um arquivo se ele também antigo, ou se não existir. Bash lida bem com isso:

$ bash -c 'touch 2.txt; sleep 1; touch 1.txt; [ 1.txt -nt 2.txt ]; echo $?;
[ 1.txt -nt 3.txt ]; echo $?'
0
0

No entanto, o Dash só funciona como esperado se ambos os arquivos existirem:

$ dash -c 'touch 2.txt; sleep 1; touch 1.txt; [ 1.txt -nt 2.txt ]; echo $?;
[ 1.txt -nt 3.txt ]; echo $?'
0
1

Estou tentando entender a lógica do código do Dash. Você pode contornar isso comportamento como este:

$ dash -c 'touch 1.txt; [ ! -f 3.txt ] || [ 1.txt -nt 3.txt ]; echo $?'
0

mas por que isso deveria ser necessário? Por que Dash escolheu essa lógica? Isso faz sentido ter a lógica do Dash em certos casos?

    
por Steven Penny 12.05.2018 / 19:47

1 resposta

2

Sua pergunta é bastante comentada, mas na minha opinião a lógica do traço faz mais sentido. Se você quiser comparar se um arquivo é mais novo que outro, os dois arquivos existentes devem ser um requisito. Este claramente não é o caso, como indicado no manual bash embora.

6.4 Expressões condicionais da Bash

file1 -nt file2

True if file1 is newer (according to modification date) than file2, or if file1 exists and file2 does not.

Página de manual do painel

file1 -nt file2

True if file1 and file2 exist and file1 is newer than file2.

why should that be needed?

Por que os dois arquivos precisam existir? Uma pergunta melhor é por que não? Por que você quer comparar se o arquivo 1 é mais novo que um arquivo não existente? É apenas uma maneira complicada de testar se o arquivo1 existe. Se você está realmente tentando comparar se um arquivo é mais novo do que outro, provavelmente é um problema que deve causar um erro se um desses arquivos estiver faltando.

Isso faria sentido com outros operadores de comparação?

Comparar um arquivo com um arquivo não existente é como comparar um inteiro com um valor nulo. Isso faria sentido se [[ 1 -gt "" ]] fosse avaliado como verdadeiro? Bem bash acha que faz sentido também ...

$ bash -c '[[ 1 -gt "" ]] && echo yes'
yes
$ dash -c '[ 1 -gt "" ] && echo yes'
dash: 1: [: Illegal number:
$ sh -c '[ 1 -gt "" ] && echo yes'
sh: line 0: [: : integer expression expected
    
por 12.05.2018 / 19:54