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.