Como faço para iniciar uma instância rxvt em um determinado diretório sem usar a opção de inicialização “-cd” (provavelmente “aspas” estão erradas)?

2

Estou brincando com o script de montagem automática udiskie. O que eu quero é que, depois de conectar uma unidade externa, um novo terminal rxvt seja aberto no local da pasta de montagem.

Tudo funciona, só o problema é: se eu lanço o rxvt-terminal com a opção -cd para mudar para o diretório, de alguma forma me impede de desmontar a unidade, MESMO DEPOIS eu cd para outro diretório. Se eu iniciar o terminal sem o -cd e cd para o diretório de montagem manualmente, eu posso desmontar assim que eu mudar para outro diretório; isso é o que eu quero. Então, minha ideia é iniciar o rxvt com a opção -hold e -e para executar o cd de alguma forma através disso.

No entanto, não consigo fazer isso funcionar; rxvt sempre me diz "não pode executar filho" ou algo assim. No meu script eu tentei tudo como rxvt-unicode -hold -e "/bin/bash -c cd $@" (o script pega o caminho da montagem como um argumento da udiskie, que funciona) com aspas em todas as combinações que eu conseguia pensar. Mesmo rxvt-unicode -hold -e "/bin/bash -c cd /etc" falha, então acho que algo está errado aqui.

    
por mischa.mole 04.12.2017 / 15:54

1 resposta

0

Everything works

Pelo contrário, nenhuma de suas abordagens funcionará. ☺

A opção -cd para urxvt altera o diretório no processo pai, que se torna o emulador de terminal no lado mestre do pseudo-terminal, antes de bifurcar o filho. O motivo pelo qual você tem problemas para desmontar é que o processo do emulador de terminal mantém esse diretório como seu diretório de trabalho.

(Observe que isso não é um problema exibido pela versão cliente-servidor do Unicode rvxt, urxvtc .)

Não há modo em que um shell Unix convencional execute um comando a partir da opção -c e, em seguida, entre na leitura do modo interativo da entrada padrão. Este não é o cmd da Microsoft / IBM com sua opção /k . ☺ Você obtém a execução qualquer da entrada padrão sem comando ou execução de um comando sem execução da entrada padrão; não ambos.

Você, sem saber, chegou perto de uma abordagem que funcionará tentando executar cd como se não fosse um shell embutido. (Seu problema em não ser capaz de executar o filho é que o nome do programa que você está tentando executar é a única string /bin/bash -c cd /etc que quase certamente não é o nome de um arquivo de imagem do programa em seu sistema.)

Na verdade, há binários autônomos cuja única tarefa real é alterar o diretório de trabalho e, em seguida, carregar a cadeia para outro programa, que seria um shell interativo nesse caso. As do my nosh toolkit e do kit de ferramentas execline da Laurent Bercot são chamadas de chdir e cd . A ferramenta de Wayne Marshall é chamada runtool .

  • urxvt -e chdir "$@" "$SHELL"
  • urxvt -e cd "$@" "$SHELL"
  • urxvt -e runtool -c "$@" "$SHELL"

A outra abordagem restante que não fornecerá exatamente o que você deseja é usar a variável de ambiente ENV . Infelizmente, para fazer uso disso, você precisa que seu shell interativo esteja no modo POSIX-conformant, o que provavelmente não será o tipo de shell interativo que você deseja; bem como um arquivo de script temporário, com todos os shenanighans de criação, segurança e limpeza que isso implica.

Leitura adicional

  • Jonathan de Boyne Pollard (2016). chdir . Guia nosh . Softwares.
  • cd . Laurent Bercot. execline . skarnet.org.
  • Wayne Marshall (2013). runtool . perp manual. §8.
  • link
por 05.12.2017 / 03:43

Tags