2015-04-29 5 views
1

Я хочу использовать вывод сценария оболочки для проверки ресурса в состоянии охраны. Я использую ниже код, который все еще не работает.Как использовать сценарий оболочки в состоянии not_if

bash "stampDisksuccess" do 
       code <<-EOH 
       whoami 
     EOH 
     user 'root' 
     not_if {"`sudo sh /home/scripts/getStampedDisk.sh test`" == ''} 
     end 

ли скрипт (getStampedDisk.sh) возвращает пустое сообщение или какие-то данные, Баш ресурс становится казнен. Там, где я ожидаю, он не должен запускаться, когда скрипт возвращает пустые данные.

Исправьте меня, если что-то не хватает.

+1

Каков результат этого? – Joop

+0

отредактировал мой вопрос .. пожалуйста, проверьте .. я не могу понять, как шеф-повар работает это внутренне .. – SASI

ответ

9

Давайте проанализируем его:

not_if {"`sudo sh /home/scripts/getStampedDisk.sh test`" == ''} 
  • Not_if ... Совершенно очевидно, что это охраннику
  • { открытие блока
  • " открытия строки
  • обратные кавычки открытия
  • команда
  • закрытие кавычки и цитат
  • == оператор
  • '' постоянная пустая строка
  • } закрытие блок

Это много операций, чтобы проверить у вас есть пустая строка. Вывод из обратных циклов не гарантированно будет действительно пустым (например, он может иметь новую строку), а затем вы сравниваете его с произвольной пустой строкой (не ноль, это строка с ничем). Есть много способов, которыми это может испортиться, и довольно сложно отлаживать непечатаемые символы.

Однако у снарядов уже есть оператор для этого, это -z для обычного bash.

Цитирование Баш документация:

-z string 
    True if the length of string is zero. 

Другой Хелпер $() оценить команду внутри сценария

Последний один [[ ]] строительство, чтобы сказать, что мы используем оператор, а не команда.

Все вместе вы в конечном итоге с исполнением охранником команды при выраженном в виде строки (Documentation on guards here)

not_if '[[ -z $(sudo sh /home/scripts/getStampedDisk.sh test) ]]' 

Цитаты из караульной документации:

Атрибут охранника принимает либо значение строки или Значение блока Ruby:

  • Строка выполняется как команда оболочки. Если команда возвращает 0, применяется защита . Если команда возвращает любое другое значение, тогда атрибут защиты не применяется.
  • Блок выполнен как код Ruby, который должен возвращать либо true, либо false. Если блок возвращает true, применяется атрибут guard . Если блок возвращает false, атрибут защиты не применяется.

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

+0

Даже если я использовал not_if '[[-z sudo sh /home/scripts/getStampedDisk.sh test]]' мой ресурс становится исполняемым, а охрана не работает. где вывод сценария оболочки пуст. – SASI

+0

Действительно ли это 0 длина? не зная внутренней части вашего файла .sh, трудно сказать. – Tensibai

+0

@SASI и вы забыли '$()', чтобы дать '-z' вывод вашей команды, а не текст самой команды. Я отредактировал свой ответ, чтобы исправить это тоже. – Tensibai