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, o único problema é: se eu iniciar o rxvt-terminal com a -cd
opção de mudar para o diretório, de alguma forma me impede de desmontar a unidade, MESMO DEPOIS de eu cd para outro diretório. Se eu iniciar o terminal sem o -cd
e cd para o diretório de montagem manualmente, posso desmontar assim que mudar para outro diretório; isso é o que eu quero. Portanto, minha ideia é iniciar o rxvt com o -hold
e a -e
opção de executar o de cd
alguma forma por meio disso.
No entanto, não consigo fazer isso funcionar; rxvt sempre me diz "não pode executar criança" ou algo assim. No meu script, tentei de tudo rxvt-unicode -hold -e "/bin/bash -c cd $@"
(o script obtém o caminho de montagem como um argumento do udiskie, isso funciona) com aspas em todas as combinações que pude imaginar. Mesmo rxvt-unicode -hold -e "/bin/bash -c cd /etc"
falha, então acho que algo está confuso aqui.
Pelo contrário, nenhuma das suas abordagens funcionará. ☺
A
-cd
opção deurxvt
alterar o diretório no processo pai, que se torna o emulador de terminal no lado mestre do pseudoterminal, antes de bifurcar o filho. A razão pela qual você tem problemas para desmontar é que o processo do emulador de terminal retém esse diretório como seu diretório de trabalho.(Observe que este não é um problema exibido pela versão cliente-servidor do Unicode rvxt,
urxvtc
.)Não há nenhum modo no qual um shell Unix convencional execute um comando da
-c
opção e, em seguida, entre no modo interativo lendo a partir da entrada padrão. Isso não é da Microsoft/IBMcmd
com sua/k
opção. ☺ Você obtém a execução da entrada padrão sem nenhum comando ou a 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 integrado. (Seu problema em não conseguir 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 de programa em seu sistema.)Na verdade, existem binários autônomos cujo único trabalho real é alterar o diretório de trabalho e, em seguida, carregar em cadeia para outro programa, que seria um shell interativo neste caso. Os do meu kit de ferramentas nosh e o kit de ferramentas executivo de Laurent Bercot são até nomeados
chdir
ecd
. A ferramenta de Wayne Marshall é chamada deruntool
.A outra abordagem restante que não fornecerá exatamente o que você deseja é usar a
ENV
variável de ambiente. Infelizmente, para fazer uso disso, você precisa que seu shell interativo esteja no modo compatível com POSIX, o que provavelmente não será o tipo de shell interativo que você deseja; bem como um arquivo de script temporário, com todas as travessuras de criação, segurança e limpeza que isso implica.Leitura adicional
chdir
. guia nosh . Programas.cd
. Laurent Bercot. execlina . skarnet.org.runtool
. manual do criminoso. §8.