ソースを取得する必要がある bash ファイルがあります。ユーザーは知らないうちに csh を持っている可能性があるため (デフォルト構成)、シェルを bash に変更したかったのですが、それがユーザーの意図であったため、ファイルを入手しました。
これには多くの助けがあり、結果のコードは次のようになります。
#!/bin/csh (AND bash!)
[ "$?shell" = "1" ] && bash --login -c 'source this_file; bash' && exit
...
this_file
ソースファイルをハードコードする必要があることを除けば、すべてが期待どおりに機能します。cshには、スクリプトのソースを開始したコマンド$_
が含まsource this_file
れますが、それをbashコマンドに渡す方法はありません。
これの意味は:
私が使用する場合:
... && set this_file=($_) && bash -c "$this_file; bash" && ...
bash は、括弧が間違っていると文句を言います (これは、bash が開始されてソースを取得しようとしたときに 2 回目に発生します)。
this_file
私が使用する場合:
... && bash -c ""$_"; bash" && ...
bash は、どちらも機能しない壊れたコマンドを取得します。
bash -c "source" "this_file" "; bash"
私が使用する場合:
... && bash --login -c "$_; bash" && ...
csh が壊れたコマンドを取得します: `Unmatched ".
$_
値を単一のコマンドとして渡す受け入れられたbash構文で使用する方法がわかりません(つまりbash -c "source this_file; bash"
)
これはテストです:
cat >a.sh<<'EOF'
[ "$?shell" = "1" ] && bash --login -c 'source a.sh; bash' && exit
a=1
EOF
そして、これが機能することを期待しています:
$ csh -c 'source a.csh'
$ echo $a
1
以前は機能していたと確信しています...なぜ今は機能しないのかを調べています。(tcl モジュール パッケージを使用してこの問題を解決しましたが、これを試してみます)