Opções de hash e shells interativos

2

A opção -s para bash não parece realmente fazer nada

Quando executo comandos com ou sem, nada muda. O que realmente me confunde é quando eu executo um script de shell que eu sempre pareço ter um shell interativo. Estou assumindo que é interativo porque quando eu uso a leitura embutida no script, ele sempre me pedirá informações. Isso o torna interativo?

O shell script é executado como interativo no fedora, e há algum exemplo da diferença que os -s podem fazer? Eu li as man pages, mas parece que não consigo gerar nenhum exemplo que tenha algum efeito. Combinei as duas perguntas porque estava tentando usar s para alterar a forma como o script recebia dados e, em alguns tutoriais, eles dizem que isso tem um efeito. Eu percebo que ele pode definir argumentos, o que eu não entendo é como ele muda para ler a partir da entrada padrão que sempre parece fazer isso de qualquer maneira

Aqui está o que eu usei para testá-lo

if [ -v $PS1 ]
then
  echo non-interactive
else
  echo interactive
fi
read ; echo $REPLY

read foi sempre capaz de trabalhar em shells não e interativos

Mesmo quando testei a presença de fd / 0 e fd / 1 em shells não interativos, eles ainda existiam

Obrigado antecipadamente

    
por rubixibuc 22.12.2011 / 11:40

4 respostas

4

O Bash também determinará se ele é interativo, examinando se sua entrada / saída está conectada a um terminal.

A opção -s não interativa permite que o script bash processe parâmetros posicionais ao ler comandos de um arquivo. por exemplo:

$ cat demo.sh
echo '$0 = ' $0
echo '$1 = ' $1
echo '$2 = ' $2

$ bash < demo.sh foo bar
bash: foo: No such file or directory

$ bash -s < demo.sh foo bar
$0 =  bash
$1 =  foo
$2 =  bar
    
por 22.12.2011 / 14:06
3

A opção -s faz com que o bash leia os comandos de sua entrada padrão. Sem essa opção, o bash trata seu primeiro argumento como o nome de um script a ser executado. Com esta opção, o bash trata todos os seus argumentos como argumentos para o script que lê na entrada padrão. A opção -s determina apenas como o bash interpreta seus argumentos de linha de comando, não se a instância do shell é interativa.

Uma instância do bash é sempre interativa se for iniciada com a opção -i . Sem -i , é interativo somente se nenhum nome de script for passado ( -s influencia isso) e tanto a entrada padrão quanto o erro padrão estão conectados a um terminal.

O teste PS1 não informa se uma instância do shell é interativa.¹ Você pode desmarcar PS1 em um shell interativo. Por outro lado, um shell não interativo geralmente herda PS1 de seu ambiente. A maneira confiável de testar se o shell está sendo executado de forma interativa é testar se $- contém i .

O read embutido funciona de qualquer shell, interativo ou não. Ele lê o que estiver conectado à entrada padrão do shell (a menos que seja redirecionado). Se você tentar ler o mesmo descritor de arquivo em que o bash está lendo o script que está sendo executado, você acabará ignorando uma linha no script (não necessariamente no local pretendido); por exemplo, se você estiver passando um script na entrada padrão do bash e quiser ler uma linha do terminal, será necessário redirecionar a read call: read line </dev/tty .

Os descritores de arquivo 0, 1 e 2 sempre existem (a menos que tenham sido fechados); eles são entrada padrão, saída padrão e erro padrão, respectivamente. Se o shell é interativo ou não, não está relacionado ao que os descritores padrão apontam, exceto que fd 0 e 2 são terminais que influenciam o status interativo do shell.

¹ Sim, estou ciente de que existem páginas da Web que reivindicam isso. Eles estão errados.

    
por 31.12.2011 / 00:04
2

Um pouco mais de informações sobre shells interativos:

Você pode descobrir se um shell é interativo ou não, verificando $- . Se $- contiver um i , o shell será interativo.

Um shell é interativo quando lê a entrada do usuário diretamente. Um shell não interativo lê comandos de um arquivo linha por linha e os executa. Ele não torna o shell interativo ao ler qualquer coisa de stdin de dentro do script, como "o script lê a entrada, não o shell" (não sei como explicar isso melhor).

    labdebian# cat ./test
    #!/bin/bash
    echo Hello World
    echo $-
    read; echo $REPLY
    echo $-

    labdebian# bash test
    Hello World
    hB
    I'm typing this
    I'm typing this
    hB

    labdebian# bash -i test
    Hello World
    himB
    I'm typing this
    I'm typing this
    himB
    
por 22.12.2011 / 14:27
0

-s não torna seu shell interativo. Use -i em vez disso.

    
por 22.12.2011 / 13:13

Tags