Bashシェルを使用していますが、ソースに必要なスクリプトの一部はcsh形式です。誰かがbashシェルからcshスクリプトをソースする方法を教えてもらえますか?
ソースとは、ソースとなるcshスクリプトが環境変数を設定できることを意味します。だから、~/.bashrc
で次のようなことをしたい:
source path/to/csh_script/script.cshrc
bashはすべてのcshスクリプトを完全に実行するわけではありません。非常に基本的なbashスクリプトがsh/dashで実行されるように、いくつかの基本的なオーバーラップがあるかもしれませんが、bashで実行に失敗した場合(bash [file]
でテスト)、それはノーゴーです。どちらか
ターミナルで実行しているように、bashスクリプトから呼び出されたcshでそれらを実行し、結果値を返すようにするか、意図したとおりに実行します。あなたがコメントしたように、これは変数や関数をメインのbashスクリプトで利用可能にしないでしょう。
ソース変数を探しているだけなら、理論的には、cshスクリプトを1行ずつ実行して、変数だけを現在のbashシェル/スクリプトに追加することができます。これに似たもの:
while read line
do
[stuff with $line]
done < /path/to/[the csh script to add]
調達するスクリプトですべての変数がどのようにレイアウトされているかわかりませんので、[$ lineのあるもの]をどのようにするかはあなた次第です。
それらがbashのような場合、スペースまたは文字で始まる行をgrepし、オプションでさらに文字を含む=
を持つことができますスペースがないので:
echo "$ line" | grep '^\s*\S*=\S*'
または、上記のように=
の後ろに次のものを追加します。
echo "$ line" | grep '^\s*\S*=.*'
しかし、私は 思考 csh変数はすべてset
/setenv
で始まるため、set/setenv行を見つけてからset/setenvを捨てることができます。スターターとしてお試しください:
echo "$line" | grep '^\s*\S*set.*=.*'
これらは単なるサンプルgrep/regexパターンです。詳細については、 this & that & others を参照してください。
または、それらが数個しかない場合は、それらを手動で確認し、すべての変数をbash/sh互換ファイルに貼り付けて、bashで問題なくソースできます。
シバンのラインはすでにあなたのためにそれの世話をしています。最初の行として#! /bin/csh -f
を持つスクリプトを実行すると、システムは#!
部分をスクリプトとして認識し、その後に指定されたインタープリター(この場合は/bin/csh
)をロードします。
または、csh /path/to/script.csh
を使用して、インタープリターを明示的に呼び出すこともできます。
これは小さなデモです。私のインタラクティブシェルはmksh
で、単純なcsh
スクリプトを呼び出しています。
xieerqi:
$ cat bin/whiledemo.csh
#! /bin/csh -f
# demoloop.csh - Sample loop script
set j = 1
while ( $j <= 5 )
echo "Welcome $j times"
@ j++
end
xieerqi:
$ echo $Shell
/bin/mksh
xieerqi:
$ bin/whiledemo.csh
Welcome 1 times
Welcome 2 times
Welcome 3 times
Welcome 4 times
Welcome 5 times
xieerqi:
$ csh bin/whiledemo.csh
Welcome 1 times
Welcome 2 times
Welcome 3 times
Welcome 4 times
Welcome 5 times
#!
の前にスペースが1つでもある場合、#!
は解釈されないため、スクリプトを呼び出す対話型シェルでスクリプトが実行されることに注意してください。当然、スクリプトとインタラクティブシェルが期待するものとの構文が異なるため、スクリプトが失敗することを期待できます。この答えを書く過程で、私はこの正確なエラーに遭遇しました。