Opções de bash e shells interativos

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

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

O script de shell é executado como interativo no fedora, e há algum exemplo de diferença que o -s pode fazer? Eu li as páginas de manual, mas não posso pareço gerar quaisquer exemplos por conta própria que tenham algum efeito. Combinei as duas perguntas porque estava tentando usar s para mudar a forma como o script recebia a entrada e, em alguns tutoriais, dizem que tem um efeito. Eu sei que ele pode definir argumentos, o que eu não entendo é como ele muda para ler a entrada padrão, ele 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 

A leitura sempre foi capaz de funcionar em shells não e interativos

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

Agradecemos antecipadamente

Resposta

O Bash também determinará se ou não é interativo examinando se sua entrada / saída está conectada a um terminal.

O -s switch não interativo permite que o script bash processe parâmetros posicionais quando 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 

Resposta

O -s opção faz com que o bash leia os comandos de sua entrada padrão. Sem esta opção, o bash trata seu primeiro argumento como o nome de um script a ser executado. opção, o bash trata todos os seus argumentos como argumentos para o script que ele lê na entrada padrão. A opção -s apenas determina 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 apenas 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 remover a definição 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 interativamente é testar se $- contém i.

O i. div id = “7f35936f21″>

integrado funciona a partir de qualquer shell, interativo ou não. Ele lê tudo o que está conectado à entrada padrão do shell (a menos que seja redirecionado). Se você tentar ler do mesmo descritor de arquivo onde o bash está lendo o script que está executando, você acabará pulando uma linha no script. (não necessariamente no local pretendido); por exemplo, se você “está passando um script na entrada padrão do bash” e deseja ler uma linha do terminal, é necessário redirecionar o read chamada: 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 influenciam o status interativo do shell.

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

Resposta

Um pouco mais de informação sobre shells interativos:

Você pode descobrir se um shell é interativo ou não verificando $-. Se $- contém um i, então o shell é interativo.

Um shell é interativo quando lê a entrada do usuário diretamente. Um shell não interativo lê os comandos de um arquivo linha por linha e os executa. não torna o shell interativo ao ler qualquer coisa de stdin de dentro do script, pois “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 

Comentários

  • O que estava confuso é que a documentação do bash diz que vai travar se você usar ler em um não – shell interativo

Resposta

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *