Я думаю, что вы смущены о разнице между поиском и выполнением сценария.
Выполнение скрипта означает создание нового процесса и запуск программы. Программа может быть сценарием оболочки или любым другим типом программы. Поскольку это подпроцесс, любые переменные среды, измененные в программе, не будут влиять на оболочку.
Поиск сценария может использоваться только с помощью сценария bash (если вы используете bash). Он эффективно вводит команды так, как если бы вы их делали. Это полезно, поскольку позволяет сценарию изменять переменные среды в оболочке.
Запуск сценария прост, вы просто вводите путь к скрипту. .
- текущий каталог. Таким образом, ./script.sh
выполнит файл script.sh
в текущей директории. Если команда является одним файлом (например, script.sh
), она проверит все папки в переменной PATH, чтобы найти скрипт. Обратите внимание, что текущий каталог не находится в PATH, поэтому вы не можете выполнить файл script.sh
в текущем каталоге, запустив script.sh
, вам нужно запустить ./script.sh
(если текущий каталог не находится в PATH, например, вы можете запустить ls
, в то время как в /bin
).
Поиск сценария не использует PATH и просто ищет путь. Обратите внимание, что source
не является программой - иначе она не сможет изменить переменные среды в текущей оболочке. На самом деле это баш, встроенный в команду. Поиск /bin
и /usr/bin
- вы не найдете здесь программу source
. Поэтому для источника файла script.sh
в текущем каталоге вы просто используете source script.sh
.
Как sudo взаимодействует с этим? Ну sudo берет программу и выполняет ее как root. Например, sudo ./script.sh
выполняет script.sh
в подпроцессе, но работает от имени root.
Что же делает sudo source ./script.sh
? Помните, что source
- это не программа (скорее, встроенная оболочка)? Sudo ожидает название программы, поэтому ищет программу с именем source
.Он не находит его, и так не получается. Невозможно запустить файл с правами root, не создавая новый подпроцесс, так как вы не можете изменить бегун программы (в данном случае bash) после ее запуска.
Я не уверен, что вы на самом деле хотели, но, надеюсь, это очистит его для вас.
Вот конкретный пример. Сделайте файл script.sh
в текущем каталоге с содержимым:
#!/bin/bash
export NEW_VAR="hello"
whoami
echo "Some text"
сделать его исполняемым с chmod +x script.sh
.
Теперь посмотрим, что происходит с Баш:
> ./script.sh
david
Some text
> echo $NEW_VAR
> sudo ./script.sh
root
Some text
> echo $NEW_VAR
> source script.sh
david
Some text
> echo $NEW_VAR
hello
> sudo source script.sh
sudo: source: command not found
Несмотря на отличные ответы, я думаю, что проблема почти опечатка.Удалите первый период, который сам по себе. – beroe
@beroe Вы ошибаетесь. Проблема не опечатка. Если 'setup.sh' не имеет прав выполнения, то вы должны явно интерпретировать его с помощью bash. Это можно сделать как 'bash setup.sh' или' source setup.sh' или '. setup.sh'. Однако, поскольку последние 2 являются встроенными bash, только 1-я форма может использоваться с ** sudo **, которая ** требует исполняемого файла **. Вы можете использовать 'sudo, которые bash' и' sudo, какой источник' и 'sudo which .', чтобы увидеть, что' sudo' найдет. –
@BrunoBronosky это выглядело (выглядит), как будто они пытаются запустить первую одиночную точку в качестве команды. Поскольку это указывает текущий рабочий каталог, который не является командой, он выдает эту ошибку. Если они поместите './Setup.sh', это будет другая история. – beroe