Довольно часто сценарий, который я хочу выполнить, не находится в моем текущем рабочем каталоге, и я не хочу его оставлять.
Это хорошая практика для запуска скриптов (BASH, Perl и т. Д.) Из другого каталога? Будут ли они обычно находить все необходимое для правильной работы?
Если да, то как лучше всего запустить «дальний» скрипт? Это
. /path/to/script
или
sh /path/to/script
и как использовать sudo
в таких случаях? Это, например, не работает:
sudo . /path/to/script
. /path/to/script
источники сценария! Вам не нужен период вообще, если вы просто хотите запустить его.Ответы:
sh / path / to / script создаст новую оболочку и запустит скрипт независимо от вашей текущей оболочки. Команда
source
(.) Вызовет все команды в сценарии в текущей оболочке. Если скрипт вызовет,exit
например, то вы потеряете текущую оболочку. Из-за этого обычно безопаснее вызывать скрипты в отдельной оболочке с помощью sh или выполнять их как двоичные файлы, используя полный (начиная с /) или относительный путь (./). Если они называются двоичными файлами, они будут выполняться с указанным интерпретатором (например, #! / Bin / bash).Что касается знания того, найдет ли сценарий нужные ему файлы, то нет хорошего ответа, кроме как посмотреть на сценарий и посмотреть, что он делает. Как вариант, вы всегда можете перейти к папке скрипта в подпроцессе, не выходя из текущей папки:
источник
(cd /wherever/ ; sh script.sh)
? Почему у вас$
впереди?Вы определенно можете сделать это (с изменениями, упомянутыми другими, например
sudo sh /pathto/script.sh
или./script.sh
). Тем не менее, я делаю одну из нескольких вещей, чтобы запустить их в масштабе всей системы, чтобы не беспокоиться о директориях и избавить меня от лишней лишней печати.1) Симлинк на
/usr/bin
(убедитесь, что там нет перекрывающихся имен, потому что вы, очевидно, переопределите его.) Это также позволяет мне хранить их в моих папках для разработки, чтобы я мог настроить их при необходимости.
2) Добавьте каталог Scripts на ваш путь (используя .bash_profile - или любой другой .profile, который есть в вашей оболочке)
PATH=/path/to/scripts/:$PATH
3) Создание псевдонима находится в
.bash_profile
в~/.bash_profile
надстройке что - то вроде:Как вы можете сказать, синтаксис просто псевдоним, цифры, которые вы хотите действовать как команда, команда. Таким образом, если вы введете «l» в любом месте терминала, то получится,
ls -l
если вы хотите sudo, простоalias sl="sudo ls -l"
отметьте для себя l vs sl (в качестве бесполезного примера).В любом случае, вы можете просто напечатать
sudo nameofscript
и быть на своем пути. Не нужно связываться с ./ или. или sh и т. д. Просто отметьте их как исполняемые в первую очередь: Dисточник
Я обычно делаю так, как ты говоришь
И запустить его от имени root / superuser
Ваш текущий каталог имеет значение, только если сценарии предполагают, что вы находитесь в той же папке, что и он. Я бы предположил, что большинство сценариев этого не делают, и вы сохраните его, как показано выше.
источник
Я обычно храню свои сценарии в (
/usr/local/bin
или/usr/local/sbin/
(если сценарию требуются права суперпользователя), где, в соответствии со стандартом иерархии файловой системы (FHS), они принадлежат.Все, что вам нужно сделать, это убедиться, что эти два каталога добавлены в ваш
PATH
. Вы можете сделать это, отредактировав свой$HOME/.bashrc
файл и добавив следующую строку:Если вы хотите иметь возможность выполнять скрипт от имени пользователя root
sudo
, вам нужно добавить эти каталоги в переменнуюsecure_path
вашего/etc/sudoers
.Редактирование этого файла выполняется путем запуска,
visudo
что гарантирует отсутствие ошибок.источник
.bashrc
вместо.bachrc
.Я не уверен, что это работает так в Linux, если предположить, что это не так, если никто не предложил это. Но вместо использования ././, чтобы вернуться в каталоги. Можете ли вы использовать кавычки, чтобы дать ему абсолютный путь? Может быть, это не дает вам доступа ко всему драйву, чтобы даже сделать это, если подумать.
источник
Если у вас есть сценарии, которые вам нужно часто запускать, и они зависят от своего местоположения для поиска ресурсов, вы можете легко сделать это, просто комбинируя команды в псевдониме, подобном этому.
Таким образом, вам не нужно ничего менять, чтобы это работало.
источник
Не уверен, почему никто не предложил этот, но это очень просто! Я гуглил несколько раз и не смог найти точный ответ, который я даю, поэтому я решил поделиться. IMO, но это лучшее, но самое простое решение, для меня, в любом случае, однако другие могут чувствовать и действовать по-другому.
Сначала команда 'cd' сообщает директории местоположения скриптов. Затем '&&', чтобы вы могли связать его после выполнения следующей команды. Наконец, откройте ваш скрипт так же, как вы бы выполняли его в терминале! Сохранено в вашем файле BASH и занимает 5 секунд для установки.
Надеюсь, это помогло кому-то.
источник
Древний вопрос, но вечный.
Решение, которое я постоянно видел, состоит в том, чтобы иметь
$HOME/bin
каталог и поместить его первым$PATH
(через,~/.bashrc
если он еще не существует; в некоторых системах по умолчанию он~/bin
первый$PATH
). Удаление сценариев для выполнения или символических ссылок на сценарии / исполняемые файлы в другом месте - это простой способ решения проблем с путями, которые не должны затрагивать систему или других пользователей.Если сценарию требуются дополнительные ресурсы, которые можно найти относительно его собственного местоположения (не редкость), тогда используется envvar
$BASH_SOURCE
.$BASH_SOURCE
всегда содержит абсолютный путь к самому выполняющемуся скрипту, независимо от значения$PWD
.Учтите следующее:
Итак, мы видим, что
$HOME/bin
это первое$PATH
, что бы я ни вставлял,~/bin
будет работать. У меня есть демонстрационный скрипт под названием~/bin/findme
:Это может быть использовано для получения абсолютного пути к местоположению запущенного скрипта.
источник
bin
каталогом? Это кажется громоздким. (3) Кроме того, это нарушает независимость местоположения. Если/home/desmond/bin/foo
есть ссылка на мой скрипт, тоBASH_SOURCE
будет/home/desmond/bin/foo
, и скрипт не сможет найти его ресурсы./bin
или находятся в известном месте/opt
. (3) Независимость от местоположения - это именно то, что сохраняется при написании взаимозависимой коллекции личных сценариев.