bashストレッチpi3B +;フォーク 'program &'のシェルスクリプト--bashがファイルを見つけることができませんそこにいる

bashストレッチpi3B +;フォーク 'program &'のシェルスクリプト--bashがファイルを見つけることができませんそこにいる

'および&なしでバリアントを試み、パス全体を綴り、$ PATHに追加しました。ハイパーピングを呼び出すスクリプトと同じディレクトリにあっても、スクリプトがハイパーピングを見つけることができないようです。ユーザーpiとして実行します。私の髪を抜いてください! !スクリプトの実際の行

if [ $(/usr/bin/pgrep -c hyperping) -eq 0 ]; then './hyperping &'; fi

PATHの「ハイパーピング」[$PATHで確認、削除&でも確認]

***pi@pi20:~/tests $ ls -lt hyperping
-rwxr-xr-x 1 pi pi 692 Jul 30 13:10 hyperping***

「hyperping」は独立してうまく機能します。

「set -xv」を使用したbash出力

***/++ /usr/bin/pgrep -c hyperping
+ '[' 0 -eq 0 ']'
+ '/home/pi/tests/hyperping &'
./at7PM: line 33: /home/pi/tests/hyperping &: *No such file or
directory*/**** 

答え1

を実行しておらず、文字通り空白と呼ばれるコマンドをhyperping実行しようとしています。これは、コマンドが不必要に引用符で囲まれているために発生します。hyperping &&./hyperping &'./hyperping &'

私はあなたが次のことをする予定だと仮定します

if ! pgrep hyperping >/dev/null; then
    hyperping &
fi

静かにできるオプションがpgrepある場合は放棄できます。-q>/dev/null

if ! pgrep -q hyperping; then
    hyperping &
fi

このコマンドは、探しているものが正常に見つかった場合は終了状態0で終了し、そうでなければゼロ以外の終了状態で終了するpgrepかのように動作します。grep実際の解析を避けるために、上記のアプローチを使用することができます。出力手がかりを命令して、何かが見つかったかどうかについて手がかりを取得します。 「runというコマンドがif ! pgrep somecommand; then ...; fiなければ...」と読み取ることができます。somecommand

答え2

SELECTが壊れていません!

'および&なしでバリアントを試み、パス全体を綴り、$ PATHに追加しました。

Kusalamandaは、スペースやアンパサンドを含むコマンドの周りにランダムな引用符を追加するエラーを指摘しました。これをしないでください。すべてをテストするにはクレイジーなアイデアが多すぎます。

Bashと同様のシェルの引用符は、他のほとんどのプログラミング言語とは異なります。主な目的は、スペースやその他のスペース文字を保存することです。残念ながら、多くの開発者は無意識のうちに他の言語から構文規則を取得し、すべての文字列に引用符が必要なように振る舞います。

ハイパーピングを呼び出すスクリプトと同じディレクトリにあっても、スクリプトがハイパーピングを見つけることができないようです。

これはまったく関係ありません。たぶん、最初のエラーを妨げる2番目のエラーかもしれません。

実行可能ファイルがパスにあるため、見つかった場合はパスを指定せずに呼び出す必要があります。

または、パスにない場合は、相対パス(例:./some/where/script.sh)または絶対パスを指定する必要があります。相対パスは、呼び出された呼び出し元(シェル内のユーザー)に基づいて見なされ、間接的に呼び出される他のスクリプト/プログラムとは相対的ではありません。

スクリプトがパスにある場合は、このような相対パスで呼び出さないでください./hyperping。しかし、hyperping相対パスで呼び出すと、パスを使用して検索するのではなく、場所によって異なります。一般的に悪い考えです。

関連情報