2013-05-30 6 views
1

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

DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 

Мой вопрос заключается в основном то, что каталог это на самом деле указывает на относительно каталога, он называется в и хранится в? Также, что это такое & & делать там? Кажется очень странным видеть, что логический оператор состоит из двух каталогов, но опять же я довольно новичок в сценариях оболочки.

ответ

3

Это просто сохраняет реж скрипт находится в:

DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 

Условие commandA && commandB оценивается так:

commandB выполняется, если, и только если, commandA возвращает статус выхода ноль , Будучи cd something, он вернет true, если существует каталог something. Если нет, он вернет статус выхода false, поэтому pwd не будет выполнен.

Графически это можно объяснить:

DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &&  pwd   )" 
DIR="$(cd ( dir ( name_of_script ) ) && print current dir )" 
DIR="$(move to the dir of the script   && print current dir )" 
DIR= "name of the dir you have moved , that is, the dir of the script" 
+0

О воах. Я даже не думал о том, что такое короткое замыкание. Это потрясающе! –

+0

Ну почти: если дир существует, он движется к нему. В противном случае он получает пустые данные. Надеюсь, это ясно из моего редактирования. – fedorqui

+0

+1, но я хочу обратиться к «выполненному, если первая часть верна»: как говорится в [руководстве] (http://www.gnu.org/software/bash/manual/bashref.html#Lists) command1 && command2 ":" command2 выполняется, если и только в том случае, если command1 возвращает статус выхода из нуля. " Таким образом, речь идет не только об истинном или ложном, это об успехе или неудаче. Команда cd может выйти из строя (если указанный каталог не существует), и в этом случае не печатайте текущий рабочий каталог. –

2
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 
|  | | | |   |___ First value | |______ prints current working directory 
|  | | | |    of array  |___Logical AND operator 
|  | | | |__ Command to strip non-directory suffix 
|  | | | 
|  | | |__ Doing command substitution again to evaluate whats inside $() 
|  | | 
|  | |___ Changing directory 
|  | 
|  |_____ $() is construct for command substitution 
| 
|____ Creating and assigning a variable called DIR 
+1

+1 Мне нравится ваш способ представления информации больше, чем мой. Мы такие художники ASCII :) – fedorqui

+0

Также оцените искусство ASCII, но в конечном итоге я нашел разбивку функции, чтобы помочь мне лучше понять, как работает эта функция, поэтому, несмотря на то, насколько это круто, мне нужно идти с fedorqui. –

+0

Спасибо @fedorqui !! –