Каково различие между определением источника (''. или 'источник') и выполнение файла в ударе?

Ну, быстрый ответ - то, что .deb пакет, который Вы пытаетесь установить, разработан для Ubuntu, не Debian. Ubuntu имеет пакет "python-appindicator", и Debian не делает.

Вы могли попытаться просто распаковать "универсальный архив" в https://stackapps.com/questions/83/stackapplet-bringing-stack-exchange-notifications-to-your-desktop-1-5-beta-2-r и видеть, работает ли он. Я отмечаю, что код имеет "/usr/share /" hardcoded повсеместно, таким образом, необходимо будет распаковать его к корневому каталогу. Eugh. Возможно, попытайтесь использовать Checkinstall и т.п.?

77
14.09.2016, 12:32
5 ответов

./test.sh выполнения test.sh как отдельная программа. Это, может оказаться, сценарий удара, если файл test.sh запускается с #!/bin/bash. Но это могло быть что-то еще в целом.

. ./test.sh выполняет код файла test.sh в рабочем экземпляре удара. Это работает как будто файл содержания test.sh был включен дословно вместо . ./test.sh строка. (Почти: существует несколько деталей, которые отличаются, такие как значение $BASH_LINENO, и поведение return встроенный.)

source ./test.sh идентично . ./test.sh в ударе (в других оболочках, source может немного отличаться или не существовать в целом; . поскольку включение находится в стандарте POSIX).

Обычно видимое различие между запущением отдельного скрипта с ./test.sh и включая сценарий с . встроенный это если test.sh сценарий устанавливает некоторые переменные среды с отдельным процессом, только среда дочернего процесса установлена, тогда как с включением сценария, среда единственного процесса оболочки установлена. Если Вы добавляете строку foo=bar в test.sh и echo $foo в конце сценария выполнения вызова Вы будете видеть различие:

$ cat test.sh
#!/bin/sh
foo=bar
$ ./test.sh
$ echo $foo

$ . ./test.sh
$ echo $foo
bar
85
27.01.2020, 19:31
  • 1
    Также добавление echo $$ к сценарию покажет довольно ясное различие. $$ переменная содержит PID текущей оболочки. примечание –   25.07.2012, 13:15
  • 2
    Другой сценарий использования использует . ./test.sh звоните из другого сценария оболочки для использования функций, которые описаны в test.sh. Я имею в виду, это не просто переменные, которые можно установить, можно также создать новые функции таким образом, которые являются затем вызываемыми от удара или некоторого другого сценария. . /usr/libexec/company/tools; custom_command "variable" –  Rqomey 31.07.2012, 11:33

Другая вещь, которую я отмечаю, является этим, если у Вас есть псевдоним как это:

# add into .bashrc_aliases
alias ls='ls -lht'

С ./test.sh Вы получите нормальное ls вывод (и другой PID, чем текущая оболочка):

auraham@pandora:~/iso$ ./test.sh 
dsl-4.4.10.iso  test.sh
3136 # PID

С . test.sh или . ./test.sh Вы получите более подробный результат (и тот же PID, чем текущая оболочка):

auraham@pandora:~/iso$ echo $$
2767 # shell PID

auraham@pandora:~/iso$ . test.sh 
total 50M
drwxrwxr-x  2 auraham auraham 4.0K Jul 30 15:41 .
-rwxrwxr-x  1 auraham auraham   32 Jul 30 15:41 test.sh
drwxr-xr-x 50 auraham auraham 4.0K Jul 30 15:30 ..
-rw-rw-r--  1 auraham auraham  50M Jul 28 17:24 dsl-4.4.10.iso
2767 # PID
3
27.01.2020, 19:31
  • 1
    Можно включать это в .bashrc if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi Затем вставьте свои псевдонимы .bash_aliases. –  auraham 01.08.2012, 04:17
  • 2
    Конечно, но не делайте Вас, все еще должны использовать alias ключевое слово? (Возможно, это - просто ошибка в Вас сообщение - на строке 3?) –  Emanuel Berg 01.08.2012, 13:26
  • 3
    , моя ошибка. Спасибо @EmanuelBerg –  auraham 01.08.2012, 21:40

При запущении скрипта первый путь выполняет его как дочерний процесс. Определение источника (второй путь), с другой стороны, запускает скрипт, как будто Вы ввели все его команды в текущую оболочку - если сценарий установит переменную, то это останется установленным, если сценарий выйдет, то Ваша сессия выйдет. Посмотрите help . для документации.

9
27.01.2020, 19:31

Основное использование мне для source (или .) функции удара.

У меня есть сценарии со многими функциями, и я выполняю всех их с моим .bashrc. Функции "становятся" командами, которые я часто использую.

-1
27.01.2020, 19:31
  • 1
    я попробовал все три метода в .bashrc - источник, абсолютное положение сценария, и название команды (помещающий сценарий в папку PATH) - и всех трех методах, работал. –  Emanuel Berg 31.07.2012, 03:16

Обычно ./file— это просто способ указать на файл, который в данном случае эквивалентен пути PWD (к текущему рабочему каталогу ), за которым следует используемое имя файла.

$ pwd
/home/isaac/me/bin/

$ realpath./file
/home/isaac/me/bin/file

Также бывает, что путь в начале строки (первый аргумент или аргумент 0 )сигнализирует оболочке о попытке выполнить этот файл. Если это сценарий оболочки, скорее всего, оболочка загрузит его для выполнения в новой среде выполнения. Если это какая-то другая форма действительного исполняемого файла, оболочка попытается выполнить его с помощью команды ядра exec.

Добавление начальной точки в командную строку (работает только в том случае, если это полный нулевой аргумент )позволит загружать сценарий оболочки (, а не внешний исполняемый файл )с той же средой выполнения, которая уже настоящее время.

$../file        # that exact same file as above, now it is sourced
$ source./file   # an equivalent (but longer) command.

Конечно, если каталог не указан в пути (, не начинающемся с точки ), потребуется некоторый поиск, чтобы найти конкретный файл для источника.

В баш:

If filename does not contain a slash, filenames in PATH are used to find the directory containing filename.

И, если в режиме POSIX, PWD также используется для поиска данного filename.

0
20.08.2021, 13:23

Теги

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