Por que a minha nova verificação interativa cygwin .bashrc não funciona?

3

Acabei de atualizar o Cygwin e o novo .bashrc contém essa linha no topo:

echo "BEFORE TEST"
# If not running interactively, don't do anything
[[ "$-" != *i* ]] && return
echo "AFTER TEST"

Eu entendo se não estiver executando interativo, você não precisa fazer nada, mas meu problema é que se eu ssh com um comando:

ssh localhost pwd

Eu vejo isto:

BEFORE TEST

Então, obviamente, ele falha no teste [[ "$-" != *i* ]] e retorna. Obviamente, ssh localhost pwd é um exemplo trivial, mas espero que .bashrc seja executado até o final se você executar um comando através de ssh . Minha automação real executa comandos remotamente contra essa instância do cygwin e está falhando porque o caminho (que é configurado por meu .bashrc ) não está sendo configurado corretamente.

Além disso, alguém pode explicar o que esse teste está realmente fazendo? O que é i ? O que $- deve representar?

    
por Lucas 09.02.2012 / 16:36

2 respostas

7

Se você executar um único comando ( pwd no seu caso) através de ssh , ele não é um shell interativo, portanto, o comportamento está correto, na minha opinião.

Você deve definir seu PATH em ~/.profile ou ~/.bash_profile , não em ~/.bashrc .

Como encontrado em bash(1) página de manual:

   PARAMETERS
      (...)
      Special Parameters
          The shell treats several parameters specially.   These  parameters  may
          only be referenced; assignment to them is not allowed.
          (...)
          -      Expands  to  the  current option flags as specified upon invoca-
                 tion, by the set builtin command, or  those  set  by  the  shell
                 itself (such as the -i option).

Portanto, i contido em $- significa que a opção -i foi usada (ou configurada automaticamente pelo shell, sendo interativa).

    
por 09.02.2012 / 17:13
2

a resposta da enzotib está correta (tão votada), mas eu pensei em complementá-la com detalhes relacionados ao shell start-up quando o shell é lançado via SSH.

Os leitores da documentação do Bash podem estar se perguntando por que é necessário que .bashrc verifique se ele está sendo executado em um shell interativo, pois o .bashrc é fornecido apenas para shells do Bash interativos . No entanto, o padrão ~/.bashrc incluído na maioria (se não em todos) sistemas semelhantes ao Unix inclui algum tipo de verificação (teste $- ou $PS1 ) para garantir que o shell atual seja interativo.

A razão para isso é que o Bash tem um caso especial para shells remotas . Embora os shells Bash não interativos não executem normalmente os comandos ~/.bashrc na inicialização, um caso especial é feito quando o shell é Chamado pelo daemon de shell remoto :

Bash attempts to determine when it is being run with its standard input connected to a network connection, as when executed by the remote shell daemon, usually rshd, or the secure shell daemon sshd. If Bash determines it is being run in this fashion, it reads and executes commands from ~/.bashrc, if that file exists and is readable. It will not do this if invoked as sh.

Para mais informações, veja minha resposta para Por que o bashrc verifica se o shell atual é interativo? .

    
por 19.04.2017 / 12:10