1

ソースを取得する必要がある bash ファイルがあります。ユーザーは知らないうちに csh を持っている可能性があるため (デフォルト構成)、シェルを bash に変更したかったのですが、それがユーザーの意図であったため、ファイルを入手しました。

これには多くの助けがあり、結果のコードは次のようになります。

#!/bin/csh (AND bash!)
[ "$?shell" = "1" ] && bash --login -c 'source this_file; bash' && exit
...

this_fileソースファイルをハードコードする必要があることを除けば、すべてが期待どおりに機能します。cshには、スクリプトのソースを開始したコマンド$_が含まsource this_fileれますが、それをbashコマンドに渡す方法はありません。

これの意味は:

  1. 私が使用する場合:

    ... && set this_file=($_) && bash -c "$this_file; bash" && ...

    bash は、括弧が間違っていると文句を言います (これは、bash が開始されてソースを取得しようとしたときに 2 回目に発生します)。this_file

  2. 私が使用する場合:

    ... && bash -c ""$_"; bash" && ... 

    bash は、どちらも機能しない壊れたコマンドを取得します。bash -c "source" "this_file" "; bash"

  3. 私が使用する場合:

    ... && 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 モジュール パッケージを使用してこの問題を解決しましたが、これを試してみます)

4

1 に答える 1

1

bash -c 'cmd'コンストラクトに引数を渡すことができますbash -c 'echo $@' arg0 1 2 3 4 5

#!/bin/csh (AND bash!)
#[ "$?shell" = "1" ] && bash --login -c 'source this_file; bash' && exit
[ "$?shell" = "1" ] && bash --login -c '${@}; bash' arg0 $_ && exit
于 2013-03-18T17:33:49.040 に答える