2012-05-09 2 views
1

Полное раскрытие: я действительно не знаю Ruby. Я в основном притворяюсь.Ruby обрабатывает мою переменную как комментарий

У меня есть сценарий, который я хочу использовать для сбора инвентаря в Casper, который я использую для управления связкой Mac. Я пытаюсь передать переменную в команду оболочки с %x. Проблема в том, что Ruby обрабатывает переменную как комментарий вместо этого. Вот соответствующий код:

def get_host 
host=%x(/usr/sbin/dsconfigad -show | /usr/bin/awk '/Computer Account/ {print $4}').chomp 
raise Error, "this machine must not be bound to AD.\n try again." if host == nil 
end 

def get_ou 
    host = get_host 
    dsout = %x(/usr/bin/dscl /Search -read /Computers/#{host}).to_a 
    ou = dsout.select {|item| item =~ /OU=/}.to_s.split(",")[1].to_s.gsub(/OU=/, '').chomp 
end 

Я попытался с помощью клещей назад вместо %x, но получил тот же результат. Команда должна вернуть кучу информации о хосте, на котором она запущена, но вместо этого возвращает результат dscl /Search -read /Computers, который всегда name: dsRecTypeStandard:Computers.

Как я могу выполнить то, что хочу?

+0

Вы уверены, что 'get_host' не возвращает пустую строку? Выполнение кода в вашем методе 'get_host' на моем Mac дает мне' '' '(предоставлено, мой компьютер не является частью домена, но он возвращает пустую строку вместо повышения ошибки) –

+0

Да, это странно. Ну, когда я запускаю его на Mac, который находится в нашем AD, и добавьте 'puts # {host}' в этот метод, он возвращает имя хоста AD хоста. Поэтому я уверен, что работает, хотя было бы неплохо узнать, почему это не ошибка. –

ответ

5

Проблема здесь. Ruby всегда возвращает последнее выражение в методе.

def get_host 
    host=%x(/usr/sbin/dsconfigad -show | /usr/bin/awk '/Computer Account/ {print $4}').chomp 
    raise Error, "this machine must not be bound to AD.\n try again." if host == nil 
end 

В этом случае последнее выражение:

raise Error, "this machine must not be bound to AD.\n try again." if host == nil 

Она возвращает значение, возвращаемое raise (которые не случится на самом деле), если host == nil или возвратит nil если host != nil. Таким образом, ваш метод никогда не вернет что-то, кроме nil. Заменить его на:

def get_host 
    host=%x(/usr/sbin/dsconfigad -show | /usr/bin/awk '/Computer Account/ {print $4}').chomp 
    raise Error, "this machine must not be bound to AD.\n try again." if host == nil 
    host 
end 
+0

Как примечание стороны, я думаю, что более идиоматично использовать ноль? при проверке значения nil, например. 'if host.nil?' http://www.ruby-doc.org/core-1.9.3/Object.html#method-i-nil-3F – sguha

+1

@sguha: Если вы используете '#nil?' beware 'BasicObject '- они не имеют' #nil? 'и могут быть использованы библиотеками, которые делают RPC и другие интересные вещи. 'BasicObject' реализуют' == ', поэтому всегда работает. http://ruby-doc.org/core-1.9.3/BasicObject.html – Blixxy

+0

У меня появилась возможность попробовать это снова сегодня. Оно работает! Спасибо LBg! –

Смежные вопросы