私は中かっこ拡張について学び、それを利用して別のコマンドライン引数を使用して同じC ++プログラムを起動できることを願っています。
端末で実行されるコードは次のとおりです。
mpirun -n 1 main.exe 1 10 0.1 1 5
main.exeの後の数字は私のプログラムの入力パラメータです。
私はこのようなことをしたい:
mpirun -n 1 main.exe 1 10 {0.1,0.2} 1 5
コードを2回実行したいです。一度は0.1で、一度は0.2を3番目の引数として使用したいと思います。
うまくいかない理由と回避策は何ですか?
最高
答え1
いいえ、動作しません。このコマンドを実行すると、支柱の拡張が拡張されます。中かっこ拡張だけが影響を受け、複数のコマンドを実行しません。あなたの場合は次のとおりです。
mpirun -n 1 main.exe 1 10 {0.1,0.2} 1 5
単に次のようになります。
mpirun -n 1 main.exe 1 10 0.1 0.2 1 5
別の値で 2 回実行するには、次のようにします。
for i in {0.1,0.2}; do
mpirun -n 1 main.exe 1 10 "$i" 1 5
done
それが実行されます。
mpirun -n 1 main.exe 1 10 0.1 1 5
続いて
mpirun -n 1 main.exe 1 10 0.2 1 5
もちろん、この特別なケースでは、支柱の拡張は不必要に複雑なので、次のことを行う必要があります。
for i in 0.1 0.2; do
mpirun -n 1 main.exe 1 10 "$i" 1 5
done
このような内容を理解するのに役立つ方法は、set -x
(bashを使用していると仮定して)実際に実行されたコマンドを表示することです。
$ set -x
$ mpirun -n 1 main.exe 1 10 {0.1,0.2} 1 5
+ mpirun -n 1 main.exe 1 10 0.1 0.2 1 5
[. . .]
を使用して再びドラッグできますが、set +x
シェルが複雑なコマンドをどのように拡張するかを正確に確認し、実際に実行されている内容を確認できます。
答え2
この質問は時々提起され、一般的な合意はfor
ループが望むことを達成するための最良かつ安全な方法であるということです。
ただし、このような構成(4つの異なる引数など)で中括弧拡張を使用できます。
printf 'mpirun -n 1 main.exe 1 10 %s 1 5\n' {p1,p2,p3,p4} | sh
つまり、パイプラインを介して複数のコマンドラインを作成し、printf
1sh
によって実行されます。
別の方法:すでにインストールしているgnu parallel
場合は、次のことを実行できます。
parallel mpirun -n 1 main.exe 1 10 {} 1 5 ::: {p1,p2,p3,p4}
どちらの場合も、{p1,p2,p3,p4}
シェルによって拡張され、次に「とp1 p2 p3 p4
」を使用して別々に(一度に1つずつ)使用されます(プレースホルダとして考えることができます...)。printf
%s
parallel
{}
インタラクティブモードで入力を保存する場合は、シェルのドキュメントの履歴拡張の章を参照する必要があります。たとえば、zsh
(and setopt histexpand
)を使用すると、次のコマンドを実行できます。
mpirun -n 1 main.exe 1 10 0.1 1 5
次に、履歴拡張を使用して同じコマンドを実行しますが、0.2
6番目の引数(0から計算を開始)を使用します。
!:-5 0.2 !:7*
他の値についても同様です。XYZ
!:-5 XYZ !:7*
rm -rf *
1:これはあなたが何をしているのかを知っていると仮定します...次のようなものをパイプしたくありません。sh
答え3
mpirun -n 1 main.exe 1 10 {0.1,0.2} 1 5
次に展開
mpirun -n 1 main.exe 1 10 0.1 0.2 1 5
これはあなたが望むものではないかもしれません。
次に{a,b,c}
展開されます。a b c
走りたいかもしれない
for x in 0.1 0.2
do
mpirun -n 1 main.exe 1 10 "$x" 1 5
done
1行でも構いませんが、インタラクティブに実行するときにキーストロークを保存するのは困難です。