Передача данных в стандартный поток процесса без последующего EOF

33

У меня есть исполняемый файл, который запускает интерактивную оболочку пользователя. Я хотел бы при запуске оболочки сначала ввести несколько команд, а затем разрешить пользователю проводить интерактивный сеанс. Я могу сделать это легко используя echo:

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

Это почти работает. Проблема в том, что команда echo, которая подает stdin процесса, попадает в EOF, как только это будет сделано, повторяя мои команды. Этот EOF приводит к немедленному завершению оболочки (как если бы вы нажали Ctrl + D в оболочке).

Есть ли способ ввести эти команды в стандартный ввод, не вызывая EOF впоследствии?

Джейсон Р
источник
Вы пытались добавить ./shell_executableв конец списка команд? Это может помочь, хотя у вас будет два запущенных экземпляра (родитель и потомок).
Златовласка

Ответы:

40

Нашел этот умный ответ в подобном вопросе в stackoverflow

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

Это делает трюк. накачает catвывод echoво входной поток shell_executable и будет ждать больше вводов до EOF.

Gowtham
источник
@ jw013 Вы правы. Я редактировал пост. Спасибо. Когда я экспериментировал без скобок, я видел cmd 1написанное обратно, но не понимал, что это должно было быть о / п, сгенерированноеcmd 1
Gowtham
ЭТО РАБОТАЕТ УДИВИТЕЛЬНО! Вы только что сэкономили мне кучу времени. Спасибо!!
Jaggedsoft
22

Чистейший способ сделать это, вероятно , искать что - то вроде bash«S --rcfileварианта. Поместите свои пользовательские команды в свой пользовательский файл и передайте его интерактивной оболочке для запуска при запуске.

Если такой опции не существует, вы также можете попробовать следующее:

cat custom_commands_file - | ./shell_executable

catбудет интерпретировать -как стандартный

jw013
источник
очень хорошее решение 💪😠
dctremblay