So I just executed "< ./somefile.txt" in linux shell,
Em bash
, dash
e shells semelhantes, que não executam um comando. Isso meramente atribui somefile.txt
a stdin. Isso não leva a nada porque stdin não é usado a menos que você forneça um comando.
Para usar stdin para algo, por exemplo, cat
:
cat <./somefile.txt
Como cat
ecoa stdin para stdout, você verá o arquivo exibido no terminal.
Por outro lado, você quer executar o script, você pode fazer isso em um subshell da seguinte forma:
bash ./somefile.txt
Ou, se (a) somefile.txt
tiver seu bit executável definido ( chmod +x somfile.txt
) e (b) for compatível com sh
ou tiver uma especificação adequada para a primeira linha, como #!/bin/bash
, então:
./somefile.txt
Ou, para executá-lo no shell atual ( isto é, fonte), execute:
. ./somefile.txt
ou:
source ./somefile.txt
Normalmente, alguém origina um script se quiser que ele altere o diretório de trabalho atual e outros aspectos do ambiente atual do shell. Se você não fizer esses efeitos colaterais, não o forneça; executá-lo em um subshell.
Uso avançado
@ StéphaneChazelas aponta que <./somefile.txt
é útil como um teste para saber se o arquivo ./somefile.txt
é legível. Por exemplo, para sair com o código 1, se ./somefile.txt
não for legível:
<./somefile.txt || exit 2
Isso funciona porque o shell só pode atribuir ./somefile.txt
a stdin se for legível. Se não estiver, o shell exibirá uma mensagem de erro e retornará o código 1. Esse código aciona a cláusula "ou ( ||
) que, nesse caso, faria o script sair com o código 2. Quanto mais padrão e portátil abordagem para o mesmo teste seria:
[ -r "./somefile.txt" ] || exit 2