Piping de dados para o stdin de um processo sem causar o EOF posteriormente

33

Eu tenho um executável que inicia um shell interativo do usuário. Eu gostaria de, após o lançamento do shell, injetar alguns comandos primeiro e depois permitir que o usuário tenha sua sessão interativa. Eu posso fazer isso facilmente usando echo:

echo "command 1\ncommand 2\ncommand3" | ./shell_executable

Isso quase funciona. O problema é que o comando echo que está alimentando o stdin do processo atinge o EOF assim que termina ecoando meus comandos. Esse EOF faz com que o shell seja encerrado imediatamente (como se você tivesse pressionado Ctrl + D no shell).

Existe uma maneira de injetar esses comandos no stdin sem causar um EOF depois?

Jason R
fonte
Você já tentou adicionar ./shell_executableao final da lista de comandos? Isso pode continuar, embora você tenha duas instâncias em execução (pai e filho).
Goldilocks

Respostas:

40

Encontrei essa resposta inteligente em uma pergunta semelhante no stackoverflow

(echo -e "cmd 1\ncmd 2" && cat) | ./shell_executable

Isso faz o truque. catbombeará a saída do echofluxo de entrada do shell_executable e aguardará mais entradas até o EOF.

Gowtham
fonte
@ jw013 Você está certo. Eu editei a postagem. Obrigado. Quando eu experimentei w / o dos parênteses, eu vi cmd 1escrito de volta, mas não percebeu que deveria ter sido o / p gerada porcmd 1
Gowtham
ISSO FUNCIONA INCRÍVEL! Você acabou de me economizar uma tonelada de tempo. Obrigado!!
Jaggedsoft #
22

A maneira mais limpa de fazer isso é provavelmente procurar algo como basha --rcfileopção. Coloque seus comandos personalizados em seu arquivo personalizado e passe-o para o shell interativo para executar na inicialização.

Se essa opção não existir, você também pode tentar o seguinte:

cat custom_commands_file - | ./shell_executable

catinterpretará -como stdin.

jw013
fonte
muito boa solução 💪😠
dctremblay 5/11