web-dev-qa-db-ja.com

bash環境からcshスクリプトをソースする方法は?

Bashシェルを使用していますが、ソースに必要なスクリプトの一部はcsh形式です。誰かがbashシェルからcshスクリプトをソースする方法を教えてもらえますか?

ソースとは、ソースとなるcshスクリプトが環境変数を設定できることを意味します。だから、~/.bashrcで次のようなことをしたい:

source path/to/csh_script/script.cshrc
2

bashはすべてのcshスクリプトを完全に実行するわけではありません。非常に基本的なbashスクリプトがsh/dashで実行されるように、いくつかの基本的なオーバーラップがあるかもしれませんが、bashで実行に失敗した場合(bash [file]でテスト)、それはノーゴーです。どちらか

  • bashで実行するように変更する、または
  • ターミナルで実行しているように、bashスクリプトから呼び出されたcshでそれらを実行し、結果値を返すようにするか、意図したとおりに実行します。あなたがコメントしたように、これは変数や関数をメインのbashスクリプトで利用可能にしないでしょう。

    • 外部ファイルに対して行うべきことを何でもするようにする、または
    • 単一の値/文字列を返すか、または
    • それらを別のプログラムのように扱い、複数行の出力を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パターンです。詳細については、 thisthatothers を参照してください。

または、それらが数個しかない場合は、それらを手動で確認し、すべての変数をbash/sh互換ファイルに貼り付けて、bashで問題なくソースできます。

2
Xen2050

シバンのラインはすでにあなたのためにそれの世話をしています。最初の行として#! /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つでもある場合、#!は解釈されないため、スクリプトを呼び出す対話型シェルでスクリプトが実行されることに注意してください。当然、スクリプトとインタラクティブシェルが期待するものとの構文が異なるため、スクリプトが失敗することを期待できます。この答えを書く過程で、私はこの正確なエラーに遭遇しました。

0