はじめに
diff -u <(du -ak hoge) <(du -ak hoge2)
のような <()
で結果をpipeで渡すのを IO.popen
で実行しようとしたら、
sh: -c: line 0: syntax error near unexpected token `('
が出たときは、実は、sh -c
で実行されてしまっているところが問題。
shでは、<
を解釈できない。
というわけで、解決法
IO.popen(["bash", "-c", exec_cmd], "r", :chdir=>execPath) {}
のように[]で、bash, -c, 実行したいコマンドとして入れてあげれば良い。
こうすれば、bashで実行される。
駄目な例
IO.popen(exec_cmd, "r", :chdir=>execPath) {}
のようになっていると、sh -c
で実行されてしまう。
exec_cmdにbash -c 実行したいコマンド
とやってもうまくはいかなく、上のように、[]で与えるべきである。
exec_cmd = "bash -c #{Shellwords.shellescape(exec_cmd)}"
のように、してもダメで、[]
として、["bash", "-c", exec_cmd]
を popen
に渡せばOkであった。