zshシェルからbashスクリプトを実行する


11

でbashスクリプトを実行できませんzsh。スクリプトは以下のスクリプトに似ており、bashで実行されることになっています。

#!/bin/bash
echo "<235234>"  | egrep -oe [0-9]+

ただし、私のシェルはデフォルトでzshにあるので、上記のスクリプトを実行するには/bin/bashzshプロンプトで次のように入力し、を実行し. script.shます。

ただし、これによりエラーが発生し、次のエラーが発生します。

zsh: no matches found: [0-9]+

235234代わりに取得する必要があります)。

この時点で私は混乱しており、次の質問があります。

  1. にいる場合bash、なぜエラーが報告されるのzshですか?
  2. なぜegrep正規表現が失敗するのですか?正規表現は私には正しいようです。

注:必要に応じて、スクリプトを変更することは想定していません(スクリプトは複数のユーザーによって共有されており、変更を加えることは想定されていません)。

ありがとう

回答:


19

スクリプトが適切で始まる場合#!/bin/bash(あなたはその前に別のコメントを持つことができない)、あなたは、単に次のように入力してそれを実行すべき/path/to/script.shことなしに、.先頭に。これ.はincludeステートメントであり、「このファイルの内容を、コマンドラインでここに入力されたかのように実行する」ことを意味します(これは、UNIXシェルの専門用語では「ソーシング」と呼ばれます)。

bashを実行し、スクリプトをソーシングすることで動作するはずです。状況によってはbashが自動的に開始されたため、zshを好むので、おそらくbshを自動的にzshに切り替えるように設定しているexec zshと思います~/.bashrc。それを行わないでください。代わりに、ログイン時に実行されるファイルでzshに切り替え、つまり~/.profile、そのままにしておき.bashrcます。zsh端末で実行するには、SHELL環境変数を設定します。

# in ~/.profile
export SHELL=/bin/zsh
if [ -t 1 ]; then exec $SHELL; fi

バグがあるため、スクリプトを変更できないのは残念です。括弧はbashであっても引用符で囲む必要があります。3+現在のディレクトリに呼び出されたファイルがある場合、への呼び出しは、一連の任意の数字ではなく、egrep1つ以上の数字の出現を検索し3ます。名前のファイルが存在する場合3+と呼ばれるファイル4+の呼び出しegrepを検索する3ファイルの中の4+。ここで、bashとzshの違いは、指定されたパターンに一致するファイルがない場合にのみ有効です。bashは、置換されていないパターンでコマンドをサイレントに実行しますが、zshはエラーを通知します(デフォルト)。


ありがとう@Guilles。これはとても役に立ちました。奇妙なことexec zshに、私に~/.bashrcはもも~/.profileありません(.profileホームディレクトリにさえありません)。zshデフォルトのシェルをどうやって作成したか思い出せません。また、混乱してしまい申し訳ありませんが、私のスクリプトの最初の行はシバン#!/bin/bashです。これでも、ファイルのソースが機能zshしない理由はまだわかりません(これについて何か考えがある場合は、私に知らせてください)。どちらの場合も、引用符を正規表現に追加するためにスクリプトを更新するよう管理者に連絡します。
Amelio Vazquez-Reina

zshでの調達に関する問題は、の2番目の引数egrepです。
Ignacio Vazquez-Abrams
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.