Выполнение команд оболочки через канал не работает

#linux #bash #shell

#линукс #удар #ракушка

Вопрос:

Вот в чем моя проблема. Я хочу сохранить некоторые часто используемые команды в txt-файле и удобно их использовать.

Вот что я сделал:

Сохраните несколько команд в txt-файле. Содержание является

 jupyter notebook --ip 0.0.0.0 --no-browser --port 6006  tensorboard --bind_all --logdir ./ --port 6006  cd ./CodeOfPapers/Seq2Seq_Transformer/  

Выполнение команд Например, cat ./cmds.txt | grep ju | bash . Это работает правильно . Успешно запущена записная книжка jupyter. ( ju является префиксом jupyter) Или cat ./cmds.txt | grep te | bash . Это тоже работает.( te является префиксом тензорной доски)

Однако, когда я запускаю третью команду, которая должна изменить мой рабочий каталог с ./ на ./CodeOfPapers/Seq2Seq_Transformer/ , ничего не произошло. Тогда я попробовал cat ./cmds.txt | grep cd | sh . По — прежнему ничего не происходило.

Я совершенно новичок в оболочке Linux. Надеюсь, вы, ребята, поможете мне понять, что я должен сделать, чтобы это сработало. Спасибо!

Комментарии:

1. Псевдонимы и функции оболочки были бы лучше

2. баш — очень удобная оболочка. * Он имеет механизм истории (используйте курсор вверх и вниз). * Это позволяет выполнять поиск в истории команд: нажмите Ctrl-R и начните вводить «jupy», он покажет вам последнюю команду, содержащую jupy. Нажмите CTRL-R еще раз, чтобы найти предпоследнюю и так далее. Нажмите клавишу Enter для выполнения или CTRL-C для прерывания.

Ответ №1:

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

 cat ./cmds.txt | grep cd | sh  ^-- executes result in new subshell  

… результат grep передается в новый sh процесс, который с радостью выполняет его (в результате изменения локального каталога этого sh процесса, но не внешнего bash процесса), а затем завершает работу. Так что вы ничего не видите. В случае других команд, поскольку они не завершаются немедленно, вы можете видеть, что их программы выполняются. Но не в вашей текущей оболочке, как вы ожидаете, а в их собственной sh под оболочке. Запустите ps -A f с другого терминала и посмотрите на деревья процессов: там будет дополнительный sh узел.

Правильный(TM) способ сделать это, как пишет @Mat в комментариях, — определить псевдонимы или функции. Псевдонимы будут выглядеть следующим образом:

 alias ju='jupyter notebook --ip 0.0.0.0 --no-browser --port 6006' alias te='tensorboard --bind_all --logdir ./ --port 6006' alias cop='cd ./CodeOfPapers/Seq2Seq_Transformer/'  

Обычно вы помещаете их в конец своей ~/.bashrc и загружаете в текущую оболочку , выполнив source ~/.bashrc после их редактирования. Теперь вы сможете выполнять эти уродливые команды, просто набрав ju , или te , или cod (вызов последней был cd бы… запутанным).

Комментарии:

1. Спасибо! Псевдоним действительно лучший выбор.