O que a execução de “./somefile.txt” no shell faz?

0

Então eu acabei de executar < ./somefile.txt em um shell, e ele não parece fazer nada (o arquivo de texto tem comandos válidos do linux). Então, onde o conteúdo do arquivo de texto está sendo redirecionado? Eu estou apenas supondo nulo, mas não tenho certeza.

SO: Ubuntu 12.04

    
por user2148703 11.08.2014 / 02:11

3 respostas

3

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
    
por 11.08.2014 / 02:17
2

Depende do shell. Com zsh, isso é descrito na seção "REDIRECTIONS WITH NO COMMAND". Por padrão, READNULLCMD será usado como o comando, cujo padrão é more .

    
por 11.08.2014 / 02:25
0

O que você tem é um comando nulo com redirecionamento. Você não especificou qual shell está usando. Vinc17 abordou o tratamento de comandos nulos no zsh. No bash, um comando nulo é simplesmente um não fazer nada; como um roteiro vazio. Você pode inferir isso se ler nas entrelinhas do Manual de referência do bash :

When a simple command is executed, the shell performs the following expansions, assignments, and redirections, from left to right.
                ︙
If no command name results, redirections are performed, but do not affect the current shell environment.  A redirection error causes the command to exit with a non-zero status.

(ênfase adicionada). Em outras palavras,

< filename

abre nome do arquivo e não faz nada com isso. Se a abertura falhar, o shell gerará uma mensagem de erro. De qualquer forma, o status de saída ( $? ) é definido adequadamente: 0 para sucesso, 1 para falha. Isso é comparável a

sleep 0 < filename

porque sleep não lê sua entrada padrão.

A variante mais interessante é

> filename

que cria nome de arquivo e não faz nada com isso. Esta é uma maneira conveniente de criar um arquivo vazio.

    
por 11.08.2014 / 19:52