自己定義のbashコマンドはターミナルでは機能しますが、スクリプトでは機能しません

ドン・ジョヴァンニ

2つのスクリプトがあります。

fail_def.sh:

#!/bin/bash -eu
function fail() {
  echo -e "$(error "$@")"
  exit 1
}

bla.sh:

#!/bin/bash -eu
fail "test"

その後source fail_def.sh、ターミナルで問題なくfailコマンドを使用できます。ただし、電話をかけるとbla.sh、常にが表示されline 2: fail: command not foundます。

経由で呼び出すか./bla.sh、bashbla.shまたはbash./bla.sh呼び出すかは関係ありませんが、エラーは残ります。

source fail_def.sh冒頭に追加bla.shすることで問題解決しますが、避けたいと思います。

必要に応じて、Macで実行されているUbuntudockerコンテナに取り組んでいます。

私はその問題をグーグルで検索しようとしましたが、いくつかの同様の問題が見つかりましたが、それらのほとんどはファイルを調達しないか、異なるシェル実装を混同することに関連しているようです。どちらもここでは当てはまらないようです。

スクリプト内でfailコマンドを機能させるにはどうすればよいですか?

イニアン

期待です!

シェルは、常に別のプロセスとして、したがって別のシェル名前空間で、シバンセパレーターを使用して実行されるスクリプトを実行します。スクリプトが実行される新しいシェルには、関数source'dがありません。

このような情報をデバッグするにecho $BASHPIDは、現在のbashプロセスのプロセスIDを、bla.shその行#!/bin/bash -euとテスト結果が生成された後にスクリプトに出力する行追加します。

$ echo $BASHPID
11700
$ bash bla.sh
6788
fail.sh: line 3: fail: command not found

これらは、インポートされた関数が共有されない別のプロセスで実行したスクリプトです。方法の1つは、2番目のスクリプトで独自のエラー処理を行い、2番目のスクリプトをソース化することです。2番目のスクリプト

$ cat fail.sh
echo $BASHPID

set -e
fail "test"
set +e

今それを実行しています

$ source fail.sh
11700
11700
bash: error: command not found

error利用可能なシェル組み込みではないので、これは明らかです。上記の場合と同じプロセスIDを確認してください。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

sedコマンドはターミナルで機能しますが、bash_aliasesまたはbashスクリプトでは機能しません

分類Dev

sedコマンドはターミナルで機能しますが、bash_aliasesまたはbashスクリプトでは機能しません

分類Dev

検索コマンドはターミナルでは機能しますが、bashスクリプトでは機能しません

分類Dev

Ubuntu-「sudoiptables」コマンドはターミナルで機能しますが、bashスクリプトでは機能しません

分類Dev

このコマンドはターミナルでは機能しますが、シェルスクリプトでは機能しません

分類Dev

Gitコマンドはターミナルで機能しますが、Groovyスクリプトからは機能しません

分類Dev

シェルスクリプト:コマンドは「foundne」ではありませんが、ターミナルではうまく機能します

分類Dev

cpはスクリプトでは機能しませんが、ターミナルでは機能します

分類Dev

ターミナルでは機能しますが、スクリプトでは機能しません

分類Dev

コマンドはターミナルでは機能しますが、Kotlinでは機能しません

分類Dev

コマンドはターミナルで機能しますが、QProcess経由では機能しません

分類Dev

コマンドはターミナルで機能しますが、Runtime.execでは機能しません

分類Dev

コマンドはcrontabで機能しませんが、ターミナルでは機能します

分類Dev

コードはターミナルで機能しますが、スクリプトでは機能しません

分類Dev

コマンドはサブプロセスまたはos.popenでは機能しませんが、ターミナルでは機能します

分類Dev

Bashコマンドはスクリプトでは機能しませんが、コンソールでは機能します

分類Dev

「g ++」はコマンドプロンプトでは機能しますが、VSCodeターミナルでは機能しません

分類Dev

履歴コマンドはターミナルで機能しますが、bashスクリプトとして記述した場合は機能しません

分類Dev

" which" コマンドは #!/bin/bash のシェル スクリプトでは機能しませんが、#!/bin/zsh では機能します

分類Dev

grepはbashスクリプトでは機能しますが、ターミナルでは機能しません

分類Dev

Linuxの表示コマンドはターミナルでは機能しますが、systemdサービスでは機能しません

分類Dev

Linux:sshコマンドはbashスクリプトの外部では機能しますが、スクリプト内では機能しませんか?

分類Dev

Bashスクリプトは機能しませんが、Mac端末ではスクリプト内のこれらのコマンドは機能します

分類Dev

@rebootはコマンドでは機能しますが、スクリプトでは機能しません-Cron

分類Dev

ターミナルでは機能するが、Bashスクリプトでは機能しないコマンド

分類Dev

エクスポート変数はターミナルでは機能しますが、シェル スクリプトでは機能しません

分類Dev

コマンド「adb」はmacOSシェルスクリプトでは期待どおりに機能しませんが、macOSターミナルでは正常に機能します

分類Dev

%in%はコンソールでは機能しますが、スクリプトでは機能しません

分類Dev

「echo」を介して取得した出力は、ターミナルに貼り付けるとコマンドとして機能しますが、スクリプトでは機能しません

Related 関連記事

  1. 1

    sedコマンドはターミナルで機能しますが、bash_aliasesまたはbashスクリプトでは機能しません

  2. 2

    sedコマンドはターミナルで機能しますが、bash_aliasesまたはbashスクリプトでは機能しません

  3. 3

    検索コマンドはターミナルでは機能しますが、bashスクリプトでは機能しません

  4. 4

    Ubuntu-「sudoiptables」コマンドはターミナルで機能しますが、bashスクリプトでは機能しません

  5. 5

    このコマンドはターミナルでは機能しますが、シェルスクリプトでは機能しません

  6. 6

    Gitコマンドはターミナルで機能しますが、Groovyスクリプトからは機能しません

  7. 7

    シェルスクリプト:コマンドは「foundne」ではありませんが、ターミナルではうまく機能します

  8. 8

    cpはスクリプトでは機能しませんが、ターミナルでは機能します

  9. 9

    ターミナルでは機能しますが、スクリプトでは機能しません

  10. 10

    コマンドはターミナルでは機能しますが、Kotlinでは機能しません

  11. 11

    コマンドはターミナルで機能しますが、QProcess経由では機能しません

  12. 12

    コマンドはターミナルで機能しますが、Runtime.execでは機能しません

  13. 13

    コマンドはcrontabで機能しませんが、ターミナルでは機能します

  14. 14

    コードはターミナルで機能しますが、スクリプトでは機能しません

  15. 15

    コマンドはサブプロセスまたはos.popenでは機能しませんが、ターミナルでは機能します

  16. 16

    Bashコマンドはスクリプトでは機能しませんが、コンソールでは機能します

  17. 17

    「g ++」はコマンドプロンプトでは機能しますが、VSCodeターミナルでは機能しません

  18. 18

    履歴コマンドはターミナルで機能しますが、bashスクリプトとして記述した場合は機能しません

  19. 19

    " which" コマンドは #!/bin/bash のシェル スクリプトでは機能しませんが、#!/bin/zsh では機能します

  20. 20

    grepはbashスクリプトでは機能しますが、ターミナルでは機能しません

  21. 21

    Linuxの表示コマンドはターミナルでは機能しますが、systemdサービスでは機能しません

  22. 22

    Linux:sshコマンドはbashスクリプトの外部では機能しますが、スクリプト内では機能しませんか?

  23. 23

    Bashスクリプトは機能しませんが、Mac端末ではスクリプト内のこれらのコマンドは機能します

  24. 24

    @rebootはコマンドでは機能しますが、スクリプトでは機能しません-Cron

  25. 25

    ターミナルでは機能するが、Bashスクリプトでは機能しないコマンド

  26. 26

    エクスポート変数はターミナルでは機能しますが、シェル スクリプトでは機能しません

  27. 27

    コマンド「adb」はmacOSシェルスクリプトでは期待どおりに機能しませんが、macOSターミナルでは正常に機能します

  28. 28

    %in%はコンソールでは機能しますが、スクリプトでは機能しません

  29. 29

    「echo」を介して取得した出力は、ターミナルに貼り付けるとコマンドとして機能しますが、スクリプトでは機能しません

ホットタグ

アーカイブ