Ruby で元のコマンド ライン引数文字列にアクセスしようとしています (つまり、事前に分割/分離された ARGV 配列を使用していません)。誰もこれを行う方法を知っていますか? 例えば:
$> ruby test.rb command "line" arguments
「行」が引用符で囲まれているかどうかを確認できるようにしたい:
"command \"line\" arguments"
任意のヒント?前もって感謝します
Ruby で元のコマンド ライン引数文字列にアクセスしようとしています (つまり、事前に分割/分離された ARGV 配列を使用していません)。誰もこれを行う方法を知っていますか? 例えば:
$> ruby test.rb command "line" arguments
「行」が引用符で囲まれているかどうかを確認できるようにしたい:
"command \"line\" arguments"
任意のヒント?前もって感謝します
私の知る限り、rubyはコマンドラインからこれらの二重引用符を削除していません。シェルはそれらを使用して内容を文字列として補間し、それらをrubyに渡します。
あなたはこのようにルビーが受け取るすべてを得ることができます:
cmd_line = "#{$0} #{ARGV.join( ' ' )}"
なぜ引用符で何が含まれているのかを知る必要があるのですか?他の区切り文字(「:」や「#」など)を使用できますか?
必要に応じて、二重引用符をエスケープしてルビーに渡すことができます。
$> ruby test.rb command "\"line\"" arguments
その場合、上記のcmd_line
変数は次の文字列を受け取ります。
test.rb comand "line" arguments
私が知る限り、プログラムに渡される前にシェルによってすべて処理される可能性は低いと思います。
Unix システムでは、コマンド ライン シェル (Bash、csh など) が自動的にそのような構文を引数文字列に変換し、Ruby 実行可能ファイルに送信します。たとえば、* はディレクトリ内の各ファイルに自動的に展開されます。これを検出する方法があるとは思えません。なぜそうしたいのかお尋ねします。
Ruby には、この目的のための特別なモジュールがあります。
http://ruby-doc.org/stdlib-1.9.3/libdoc/shellwords/rdoc/Shellwords.html
あなたが欲しいのはただ:
require 'shellwords'
Shellwords.join ARGV[1..-1]
:p
これは役立つはずです:
cmdline = ARGV.map{|x| x.index(/\s/) ? "\"#{x}\"":x}.join " "
シェルは引用符内の単語を 1 つの引数にグループ化するため、各引数に空白が含まれているかどうかを確認し、含まれている場合は引用符で囲む必要があります。
ワイルドカード (*)、env 変数 ($VAR)、およびスクリプトに渡す前にシェルが展開するその他のものは保持されません。
展開なしでコマンドをそのまま渡すことができるようにするには、次のように IO を介して渡す必要があります。echo "ls *" | my_script.rb