Установите постоянную командную комбинацию в терминале на компакт-диск для загрузки [duplicate]

Этот вопрос уже имеет ответ здесь: Почему не & ldquo; cd & rdquo; работать в сценарии оболочки? 3 ответа

Я написал новый текстовый файл в /bin с именем ram, который содержит:

watch -n 1 free -h

и файл sen:

watch -n 1 sensors

в той же папке, чтобы избежать ввода

watch blahblahblah...

каждый раз.

Кроме того, я изменил разрешения этих двух из

-rw-r--r--

до

-rw-r--r-x

и достигли моей цели. Он работал даже после повторного открытия оболочки, т. Е. Тогда я мог бы ввести ram вместо watch -n 1 free -h

Но проблема возникла после того, как я попробовал ту же процедуру для

cd /home/myname/Downloads/

и новый текстовый файл, сохраненный в /bin и названный dow, тот же, что и с разрешениями.

На этот раз dow ничего не делает в терминале, даже не показывая никакого сообщения.

Я попробовал сохраняя тот же файл в /usr/bin, но снова терминал ничего не делает, и мой рабочий каталог не изменяется.

Как это возможно?

5
задан 24 March 2018 в 00:13

4 ответа

Это межсайтовый дубликат: https://stackoverflow.com/a/255415/383694.

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

Два смягчения:

выполнить . dow, чтобы сценарий выполнялся в контексте текущей оболочки. используйте псевдоним, например, в вашем файле ~ / .bashrc, который изменит каталог - например alias dow="cd /home/myname/Downloads/".

Если вы меняете каталог, обычно рекомендуется проверить, что он работал, прежде чем делать другие вещи.

В связанном вопросе есть другие варианты.

3
ответ дан 17 July 2018 в 18:13

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

Оболочка, выполняемая скриптом, выполняет именно то, что говорит скрипт; он изменяет свою рабочую директорию на ~/Downloads. Для этого нет ничего другого, поэтому он выходит. Каталог вызывающей оболочки не был изменен.

Вам не нужно заверить свое слово - вы можете продемонстрировать это, добавив ls в следующую строку вашего dow файла. Содержимое вашего каталога ~/Downloads (при условии, что оно есть) будет отображаться при запуске команды (без обычных цветов, которые предоставляются псевдонимом в вашем ~/.bashrc, который неинтерактивные оболочки не читают) ,

Чтобы выполнить скрипт в текущей оболочке, вы можете использовать команду source, которая также может быть записана как . file. Итак, если вы наберете

. dow

Ваша текущая оболочка изменит каталог.

Или вы можете вместо этого установить псевдоним:

zanna@toaster:~$ alias dow='cd $HOME/Downloads' zanna@toaster:~$ dow zanna@toaster:~/Downloads$

Чтобы сделать он постоянный, добавьте строку

alias dow='cd $HOME/Downloads'

в ваш файл ~/.bashrc. Он будет доступен каждый раз при запуске интерактивной оболочки.

7
ответ дан 17 July 2018 в 18:13

Это межсайтовый дубликат: https://stackoverflow.com/a/255415/383694.

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

Два смягчения:

выполнить . dow, чтобы сценарий выполнялся в контексте текущей оболочки. используйте псевдоним, например, в вашем файле ~ / .bashrc, который изменит каталог - например alias dow="cd /home/myname/Downloads/".

Если вы меняете каталог, обычно рекомендуется проверить, что он работал, прежде чем делать другие вещи.

В связанном вопросе есть другие варианты.

3
ответ дан 23 July 2018 в 19:02

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

Оболочка, выполняемая скриптом, выполняет именно то, что говорит скрипт; он изменяет свою рабочую директорию на ~/Downloads. Для этого нет ничего другого, поэтому он выходит. Каталог вызывающей оболочки не был изменен.

Вам не нужно заверить свое слово - вы можете продемонстрировать это, добавив ls в следующую строку вашего dow файла. Содержимое вашего каталога ~/Downloads (при условии, что оно есть) будет отображаться при запуске команды (без обычных цветов, которые предоставляются псевдонимом в вашем ~/.bashrc, который неинтерактивные оболочки не читают) ,

Чтобы выполнить скрипт в текущей оболочке, вы можете использовать команду source, которая также может быть записана как . file. Итак, если вы наберете

. dow

Ваша текущая оболочка изменит каталог.

Или вы можете вместо этого установить псевдоним:

zanna@toaster:~$ alias dow='cd $HOME/Downloads' zanna@toaster:~$ dow zanna@toaster:~/Downloads$

Чтобы сделать он постоянный, добавьте строку

alias dow='cd $HOME/Downloads'

в ваш файл ~/.bashrc. Он будет доступен каждый раз при запуске интерактивной оболочки.

7
ответ дан 23 July 2018 в 19:02
  • 1
    Стоит добавить, что alias, вероятно, лучший подход для команд watch. – Boris the Spider 24 March 2018 в 13:51
  • 2
    @BoristheSpider согласился, но могли бы вы дать твердое обоснование? Я был соблазн добавить & quot; и почему вы помещаете свои собственные программы здесь вместо ~/bin или /usr/local/bin? & Quot ;, но у меня нет никаких оправданий, кроме соглашения и приоритета PATH ... – Zanna 24 March 2018 в 15:25
  • 3
    Конвенция является веской причиной. Кроме того, предоставление непривилегированным пользователям системы удалять случайные исполняемые файлы в /bin довольно ... опасно. ~/bin будет лучшим выбором, и в этом случае, как пользователь обрабатывает , их окружение является их собственным выбором. – Boris the Spider 24 March 2018 в 15:28

Другие вопросы по тегам:

Похожие вопросы: