9

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

Это хорошая практика для запуска скриптов (BASH, Perl и т.д.) Из другого каталога? Будут ли они обычно находить все необходимое для правильной работы?

Если так, каков наилучший способ запустить "дальний" скрипт? Это

. /path/to/script

или же

sh /path/to/script

и как использовать sudo в таких случаях? Это, например, не работает:

sudo . /path/to/script

8 ответов8

12

sh /path /to /script создаст новую оболочку и запустит скрипт независимо от вашей текущей оболочки. Команда source (.) Вызовет все команды в скрипте в текущей оболочке. Если скрипт вызовет, например, exit , то вы потеряете текущую оболочку. Из-за этого обычно безопаснее вызывать скрипты в отдельной оболочке с помощью sh или выполнять их как двоичные файлы, используя либо полный (начиная с /), либо относительный путь (./). Если они называются двоичными файлами, они будут выполняться с указанным интерпретатором (#!/bin /bash, например).

Что касается того, чтобы узнать, найдет ли сценарий нужные ему файлы, то нет хорошего ответа, кроме как посмотреть на сценарий и посмотреть, что он делает. Как вариант, вы всегда можете перейти к папке скрипта в подпроцессе, не выходя из текущей папки:

$(cd /wherever/ ; sh script.sh)
6

Вы определенно можете сделать это (с изменениями, упомянутыми другими, такими как sudo sh /pathto/script.sh или ./script.sh). Тем не менее, я делаю одну из нескольких вещей, чтобы запустить их в масштабе всей системы, чтобы не беспокоиться о директориях и избавить меня от лишней лишней печати.

1) Симлинк на /usr/bin

ln -s /home/username/Scripts/name.sh /usr/bin/name

(убедитесь, что там нет перекрывающегося имени, потому что вы, очевидно, переопределите его.) Это также позволяет мне хранить их в папках для разработки, чтобы я мог настроить их по мере необходимости.

2) Добавьте каталог Scripts на ваш путь (используя .bash_profile - или любой другой .profile, который есть в вашей оболочке)

PATH=/path/to/scripts/:$PATH

3) Создайте псевдонимы в .bash_profile в ~/.bash_profile добавьте что-то вроде:

alias l="ls -l"

Как вы можете сказать, синтаксис просто псевдоним, цифры, которые вы хотите действовать как команда, команда. Таким образом, ввод "l" в любом месте терминала приведет к ls -l Если вы хотите sudo, просто alias sl="sudo ls -l" чтобы отметить для себя l vs sl (в качестве бесполезного примера).

В любом случае, вы можете просто набрать sudo nameofscript и быть в пути. Не нужно связываться с ./ или. или ш и т. д. Сначала отметьте их как исполняемые:D

3

Я обычно делаю так, как ты говоришь

sh /path/to/script

И запустить его от имени root/superuser

sudo sh /path/to/script

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

3

Я обычно храню свои скрипты в /usr/local/bin или /usr/local/sbin/ (если скрипту нужны привилегии root), где, в соответствии со стандартом иерархии файловой системы (FHS), они принадлежат.

Все, что вам нужно сделать, это убедиться, что эти две директории добавлены в вашу PATH . Вы можете сделать это, отредактировав файл $HOME/.bashrc и добавив следующую строку:

export PATH=$PATH:/usr/local/sbin:/usr/local/bin

Если вы хотите иметь возможность выполнять скрипт от имени root с помощью sudo , вы должны добавить эти каталоги в переменную secure_path в вашем /etc/sudoers .

Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

Редактирование этого файла выполняется с помощью visudo что гарантирует отсутствие ошибок.

0

Не уверен, почему никто не предложил это, но это очень просто! Я погуглил несколько раз и не смог найти точный ответ, который я даю, поэтому я решил поделиться. IMO, но это лучшее, но и самое простое решение, для меня, в любом случае, однако другие могут чувствовать и действовать по-другому.

# Place this somewhere in your .bashrc/.bash_profile/etc and edit as you see fit

YOURCOMMAND () {
  cd /path/to/directory/containing/your/script/ && ./YOURSCRIPT
}

Сначала команда 'cd' сообщает директории местоположения скриптов. Затем '&&', чтобы вы могли связать его после исключения следующей команды. Наконец, откройте ваш скрипт так же, как вы бы выполняли его в терминале! Сохранено в вашем файле BASH и занимает 5 секунд для установки.

Надеюсь, это помогло кому-то.

0

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

alias run-script="cd /home/user/path/to/script/ && bash script.sh"

Таким образом, вам не нужно ничего менять, чтобы это работало.

0

Я не уверен, что это работает так в Linux, если предположить, что это не так, если никто не предложил это. Но вместо того, чтобы использовать.// вернуться к каталогам. Можете ли вы использовать кавычки, чтобы дать ему абсолютный путь? Может быть, это не дает вам доступа ко всему драйву, чтобы даже сделать это, если подумать.

-1

Древний вопрос, но вечный.

Решение, которое я постоянно видел, состоит в том, чтобы иметь каталог $HOME/bin и поместить его первым в $PATH (через ~/.bashrc если его там еще нет; в некоторых системах ~/bin по умолчанию является первым в $PATH ). Удаление сценариев для выполнения или символических ссылок на сценарии / исполняемые файлы в другом месте - это простой способ решения проблем с путями, которые не должны затрагивать систему или других пользователей.

Если сценарию требуются дополнительные ресурсы, которые можно найти относительно его собственного местоположения (не редкость), тогда используется envvar $BASH_SOURCE . $BASH_SOURCE всегда содержит абсолютный путь к самому запущенному скрипту, независимо от значения $PWD .

Учтите следующее:

ceverett@burrito:~$ echo $PATH
/home/ceverett/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

Таким образом, мы видим, что $HOME/bin является первым в $PATH , поэтому все, что я вставлю в ~/bin будет работать. У меня есть демонстрационный скрипт ~/bin/findme:

#!/bin/bash

echo "Running from $BASH_SOURCE"

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

ceverett@burrito:~$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~$ cd foo
ceverett@burrito:~/foo$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~/foo$ cd /
ceverett@burrito:/$ findme
Running from /home/ceverett/bin/findme

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .