シェルスクリプトの同じスクリプトにtcshとbashコマンドの両方を含めることはできますか?

シェルスクリプトの同じスクリプトにtcshとbashコマンドの両方を含めることはできますか?

たとえば、tcshを使って多くのコードを修正しました。両方のコマンドを含むスクリプトを使用できますか?個人用なので高級感は問題になりません。

答え1

私はスクリプトでシェルタイプを混在させて一致させることをお勧めしません。

  1. コマンドを実行して結果を返すためにシェルを起動する効率が低下します。
  2. スクリプトに必要なすべてをスクリプトに保持する理由の1つは、スクリプトが関数などで宣言され、返されたすべての変数にアクセスできることです。いくつかのコマンドを実行してから返すために変数全体のスタックを別のシェルに渡すことは、やや直感に反しているようです。

最良の方法は、既知のスクリプトをコピーし、呼び出しシェルを変更して何が間違っているかを調べて、解決する必要がある構文の違いがどこにあるかを判断することです。

しかし、簡単に言えば、スクリプトに混ぜて使用しようとするのは良くない考えのようです。 (体牛)

答え2

私は他の答えに同意します。これは一般的に良い考えではありません。

ただし、スクリプトからシェルを呼び出すことはできます。現在tcshを使用してスクリプトを作成していて、いくつかのbash関連機能を使用したい場合は、bashを明示的に呼び出すことができます。たとえば、bashを使用すると、stdoutとstderrを独立してリダイレクトする方が簡単になります。

#!/bin/tcsh -f

echo Hello, tcsh
bash -c 'echo Hello, bash 1>&2' # writes to stderr
echo Good-bye, tcsh

しかし、長期的には、bashを使用するようにスクリプト全体を変換する方が良いかもしれません。

必須リンク:http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/

答え3

いいえ、できません。

その理由は、シェルが実行されたときにファイルの塊を読み取るために、1つの塊に別のシェルで実行したいシェルコードを含めることができますが、最初のシェルがすでに読み込まれているため、2番目のシェルがそれを読み取ることができないためです。スクリプトの実行について(シェルがlseek()ファイルにアクセスできる場合は機能できますが、シェル言語はそれほど高度ではありません)

しかし、これを行うための汚い方法があります。 zshには、シェル言語を動的に切り替えるための
コマンドがあります。emulateしかし、tcshとbashをエミュレートするためにzshを使用するのは複雑すぎるだけでなく、汚れています。

私はbashがもっと現代的だとは思わない。実際にはより広範囲ですが、機能を非常にゆっくりと採用しています。 Bashは互換性にもっと焦点を当てています。

関連情報