2

Я понимаю, что .bash_profile - это скрытый файл, отсюда и период.

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

q1) Почему мы должны все еще ./ ? Можем ли мы просто поставить название сценария?

q2) Какая разница между . bash_profile и . ./.bash_profile? . ссылаясь на текущий каталог или . = источник?

==================================

Вопросы о дополнениях

Ниже мой путь

[oracle@SJOAM scripts]$ echo $PATH
.:/usr/local/java/bin:/usr/local/java/db/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oracle/bin:/u01/app/oracle/product/11.2.0/dbhome_1/bin:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin:/u01/app/oracle/dba_scripts/bin

Как видите, оно не заканчивается на: и после этого места нет. Я сейчас в каталоге

[oracle@SJOAM bin]$ cd ~/scripts
[oracle@SJOAM scripts]$ pwd
/home/oracle/scripts
[oracle@SJOAM scripts]$ ls
rmanbkp.sh  test.sh

Но я все еще могу выполнить test.sh без указания ./test.sh /home /oracle /scripts не находится внутри моего $ PATH

=============================

Q1) Почему я все еще могу выполнить сценарий без указания./?

Q2) Если в моем $ PATH есть каталог, который не существует, будет ли поиск продолжаться через оставшуюся часть PATH?

В3) Имеет ли неправильный каталог в $ PATH = текущий каталог?

2 ответа2

3

q1

Если команда указана без каталога, выполняется поиск в PATH. Если команда не найдена в PATH, выдается сообщение об ошибке. Это для вашей безопасности.

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

Иногда люди помещают текущий каталог в PATH. PATH - это список каталогов, разделенный двоеточиями. Если один из этих каталогов пуст, то он интерпретируется как текущий каталог. Например, в этом PATH пустое пространство после последнего двоеточия интерпретируется как текущий каталог:

$ echo $PATH
/bin:/usr/bin:/opt/bin:/usr/local/bin:

С такой переменной PATH вы можете выполнить команду в текущем каталоге, не указывая ./ перед ее именем. Имейте в виду, однако, что это может иногда привести к неприятному сюрпризу.

q2

Да, ведущая точка-пространство означает источник сценария. Создание сценария означает, что он выполняется в текущей оболочке, а не в подоболочке. Источник сценария может изменить текущую среду. Скрипт в подоболочке не может. Следующие две команды эквивалентны:

source ~/.bashrc
. ~/.bashrc

Таким образом, (1) начальная точка в командной строке означает «источник сценария» и (2) начальная точка в имени файла означает, что файл скрыт. Эти два использования точки являются отдельными и независимыми.

Q1

Первый каталог в . который является текущим каталогом. Вот почему вы можете выполнять скрипты в текущем каталоге, не указывая их каталог.

Поскольку текущий каталог указывается первым, этот PATH особенно опасен: это означает, что любой сценарий в текущем каталоге будет иметь приоритет над всеми стандартными исполняемыми файлами в /bin , /usr/bin и т.д. Это может привести к сбою любой программы, которая может запускать обычные исполняемые файлы.

Q2

Давайте сделаем тест, добавив несуществующий каталог, назовем его nonsense , в PATH:

$ type date
date is hashed (/bin/date)
$ export PATH=/usr/bin/:nonsense:/bin
$ hash -r  # delete the cache
$ date
Thu Jul  9 11:13:18 PDT 2015

Неверные пути игнорируются, и поиск продолжается со следующего элемента в списке PATH.

Q3

Нет, плохие каталоги в PATH не интерпретируются как текущий каталог. Например:

$ export PATH=/usr/bin/:nonsense
$ date
bash: date: command not found
$ cd /bin
$ date
bash: date: command not found
$ ./date
Thu Jul  9 11:17:34 PDT 2015
0

Имя файла .bash_profile с начальной точкой.

Команда на источник файла в текущих . (Точка)

Итак, вы хотите . .bash_profile - (команда = "."; аргумент = ". bash_profile" `)

Еще один способ сказать то, что может быть более очевидным:

filename=".bash_profile"
. "$filename"

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