Скрипт для ls после cd - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь создать bash-скрипт, в котором каждый раз, когда я выполняю команду cd, я получаю список файлов и папок новой папки (ls).

Я нашел следующую функцию bash, чтобы сделать это:

#!/bin/bash

cs() { cd "$@" && ls; }

Я сохранил это: ~/.scripts/cs. Это сработало. Я добавил его в свой PATH, в .bash_profile:

PATH=$PATH:$HOME/.scripts
export PATH

Когда я выполняю это как . .scripts/cs, это работает, но когда я в другом окне, ничего не происходит. Я подумал, что мне нужно вызвать функцию внутри скрипта, поэтому я изменил ее:

#!/bin/bash

cs() { cd "$@" && ls; }

cs

И теперь, когда я выполняю cs в других окнах, я просто получаю правильную команду ls, но она не меняет каталог.

После всего, что я прочитал, я пришел к выводу, что команда cs выполняется в «подоболочке», и команда cd выполняется там, а в моей текущей оболочке я получаю только ls. Я попытался создать псевдоним в моем файле .bashrc:

alias cs='. cs'

Но, честно говоря, я не знаю, что должно произойти, и я получаю только следующую ошибку:

bash: /home/ggf/.scripts/cs: line 4: syntax error near unexpected token `('
bash: /home/ggf/.scripts/cs: line 4: `cs() { cd "$@" && ls; }'

Есть решение или рекомендация? Извините за мой плохой английский, я из Аргентины. Любое решение для последней ошибки тоже? Я думаю, что это было бы полезно для другого случая.

1 Ответ

0 голосов
/ 08 января 2019

Просто поставь

cs() { cd "$@" && ls; }

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

Объяснение того, почему он в значительной степени должен идти в .bashrc: если вы поместите его в отдельный файл в PATH, то по умолчанию он будет запущен в подпроцессе; изменения, которые он делает (включая изменение каталога, определение функций, псевдонимов и т. д.), будут локальными для этого подпроцесса. Есть способы избежать этого, но все они включают либо дополнительный набор текста, либо изменение .bashrc (или другого файла запуска оболочки):

  • Вы можете запустить этот файл с помощью . или source, что требует дополнительного набора текста каждый раз, когда вы используете функцию. (Примечание: в этом случае вы не будете использовать функцию, просто запустите файл cd "$@" && ls напрямую.)
  • Вы можете создать псевдоним для . или source файла, но затем вам нужно изменить .bashrc, чтобы включить это определение псевдонима.
  • Вы можете поместить определение функции (или псевдонима) в файл и загрузить его с помощью . или source, но это требует дополнительной типизации при каждом открытии оболочки.
  • Вы можете автоматизировать это, используя . или source в своем .bashrc, но теперь вы модифицируете .bashrc, и вы можете просто поместить определение прямо там.

    (Исключение: некоторым людям нравится организовывать свои файлы запуска оболочки, например, в файл определений псевдонимов, одно из определений функций, другое из настроек параметров и т. Д., А затем source из .bashrc и / или другие файлы запуска оболочки. Некоторые ОС даже поставляются с файлами запуска по умолчанию, которые поддерживают это «из коробки». Если вы находите такую ​​организацию полезной, обязательно используйте ее.)

Кстати, я иногда вижу, как люди создают слишком сложные решения таких проблем, как, например, наличие псевдонима, который создает файл, который создает функцию ... IMO, если эта сложность на самом деле не делает что-то полезное, потеряйте его. В этом случае функция может делать все, что нужно, так что это все, что вам нужно использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...