#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. Спасибо! Псевдоним действительно лучший выбор.