2012-05-09 6 views
1

全開示:私は本当にRubyを知らない。私はほとんどそれを偽っている。Rubyは私の変数をコメントとして扱っています

私は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です。

私は何をしたいのですか?

+0

'get_host'は空の文字列を返していませんか?私のMac上の 'get_host'メソッド内でコードを実行すると私は' '' '(与えられたマシンはドメインの一部ではありませんが、エラーを出すのではなく空文字列を返します) –

+0

ああ、さて、AD上にあるMac上で実行し、そのメソッドに '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 

それはhost == nil場合(つもりが実際に発生しません)raiseの戻り値を返しますかhost != nil場合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? 'を使用している場合は、' BasicObject ' - これらは' #nil? 'を持っておらず、RPCやその他の面白いことをするライブラリによって使われるかもしれません。 'BasicObject'は' == 'を実装するので、常に動作します。 http://ruby-doc.org/core-1.9.3/BasicObject.html – Blixxy

+0

今日はもう一度試してみる機会があります。できます!ありがとうLBg! –

関連する問題