Различие между получением скрипта с точкой -с помощьюsource
(или с помощью .
, что является стандартной командой ), и запуском его как собственного скрипта обсуждалось ранее.
См., например,. " В чем разница между поиском ('.' или «источник» )и выполнение файла в bash? ». Это сводится к разнице между запуском скрипта в его собственной отдельной среде (без source
или.
)и запуском набора команд в текущей среде оболочки, которую вы хотите do, если вам нужно установить переменные среды, параметры оболочки и т. д. для текущей оболочки. Установка параметра оболочки или экспорт переменной в скрипте (, который не выполняется с помощью source
или .
), не повлияет на родительскую оболочку.
Конкретный тест, о котором вы спрашиваете,
[ -z "$PS1" ] && return
вернется из сценария точки -, если первичная подсказка $PS1
пуста. Это один из способов проверить, является ли текущий сеанс оболочки интерактивным или нет. Если он не интерактивный, переменная PS1
не будет установлена, а приглашение будет пустым, и в этом случае остальную часть скрипта (, предположительно ), не нужно запускать, поскольку он, возможно, имеет дело только с вещами. который требует инициализации в интерактивной оболочке.
Сценарий с точкой -должен будет использовать return
, а не exit
, так как exit
завершит текущий сеанс оболочки, что совпадает с сеансом, который вызвал сценарий с помощью source
или .
. Таким образом, скрипт с точкой -ведет себя во многом как функция оболочки.
Запуск cd/bin/cat
в оболочке будет работать, если текущий каталог содержит каталог с именем cd
, который, в свою очередь, содержит каталог bin
и имеет исполняемый файл cat
. В противном случае вы, вероятно, получите такие ошибки, как «Нет такого файла или каталога».
С другой стороны, cd /bin/cat
попытается изменить текущий каталог на /bin/cat
, что, вероятно, не сработает, так как обычно это расположение стандартной утилиты cat
и двоичных файлов для программ. являются файлами , а не каталогами. Хотя не исключено, что это каталог, но это была бы несколько странная система.
Я вижу две причины.
Нужен пробел после команды. Вы должны отделить команду от ее параметров. (Таким образом, MS -Windows не нуждается в пробеле, но это делает ее более склонной к -неожиданным действиям. )cd /bin/cat
Следующая проблема заключается в том, что /bin/cat
не является каталогом (ну почти наверняка ).
Я не могу сказать вам больше, так как не знаю, что вы пытаетесь сделать.