разница между выполнением сценария оболочки напрямую и через канал

мой сценарий оболочки с именем mongoLogin.sh, как показано ниже:

#!/bin/sh
mongo
use demo
show tables

функция, описанная выше, - это вход в систему mongo и отображение таблиц базы данных, называемой demo.
если я выполню его напрямую:

sh mongoLogin.sh

оно работает. однако, если я выполню его таким образом, как показано ниже:

cat mongoLogin.sh | sh

по сравнению с прямым выполнением, он завершится автоматически, как и я ctrl+c после его прямого выполнения. Казалось, что команда sh после канала создаст новый подпроцесс, и этот подпроцесс завершится по какой-то причине.
Существует ли какой-нибудь метод, с помощью которого я могу добиться того же результата, выполнив скрипт через канал?

обновление: при непосредственном выполнении казалось, что действует только первая команда, потому что следующие команды являются операциями монго, а не командами оболочки. И когда я выполняю его по каналу, все команды вступают в силу, но он автоматически завершается.

вывод выполнения через канал, как показано ниже:

xxx@xxxMacBook-Pro:~/Downloads$cat mongoLogin.sh | sh
MongoDB shell version v4.0.3
connecting to: mongodb://127.0.0.1:27017
Implicit session: session { "id" : UUID("43c55950-f9e2-49ca-a458- 
611f8c71eae4") }
MongoDB server version: 4.0.3
switched to db demo
test
bye

person nail fei    schedule 30.04.2019    source источник


Ответы (1)


Оба варианта не работают, потому что use demo не является допустимой командой оболочки.

Я не работал с монго, но если команда принимает ввод со стандартного ввода, вы можете попробовать

mongo <<OGNOM
use demo
show tables
OGNOM

Убедитесь, что итоговый ОГНОМ начинается в первой колонке вашей строки!

person user1934428    schedule 30.04.2019
comment
казалось, что use demo действует при выполнении скрипта через канал. Я добавил его вывод. - person nail fei; 30.04.2019
comment
В вашем примере вы просто передаете строки своего скрипта (который лучше рассматривать не как скрипт, а просто как набор входных строк) на стандартный ввод sh. Как только sh увидит строку mongo, он запустит монго, и теперь весь stdin переходит на монго. Это означает, что строка use передается в монго. - person user1934428; 30.04.2019
comment
@ user1934428 Да, я во многом с тобой согласен. Но теперь вопрос в том, что он выйдет автоматически, чего я не ожидаю. - person nail fei; 30.04.2019
comment
Когда входной файл заканчивается, отправляется EOF, что приводит к завершению работы mongo. Что еще должен делать монго? Если вы хотите впоследствии взаимодействовать с открытым сеансом, вам понадобится что-то вроде (например) Ожидать. - person user1934428; 30.04.2019