Run_at_startup.sh
次の行を含むスクリプトがあります。
/bin/bash "$(pwd)/Testing_3.sh"
手動で実行するとよくRun_at_startup.sh
出ますねTesting_3.sh
。ただし、Run_at_startup.sh
実行するcrontab
とTesting_3.sh
実行されません。明らかにそれが問題です$(pwd)
。それでは、$(pwd)
実行しているスクリプトでは使用できませんかcrontab
?それでは、代わりに何を使用できますか$(pwd)
?
答え1
これを呼び出したプロセスの現在の作業ディレクトリにあるスクリプトを実行するには./that-script
。
"$(pwd)/that-script"
POSIXのようなシェル(cron
コマンドラインを解析するにはPOSIXのようなシェルを呼び出す必要があります)では、追加のプロセスを実行する必要があり、ストリッピングの"$PWD/that-script"
ために悪いです。$(...)
みんな$PWD
後行改行。したがって、現在の作業ディレクトリへの保存されたパスが改行で終わっても機能しません。
./that-script
と"$PWD/that-script"
(以下に拡張予定)の違い/path/to/working/directory/that-script
は、前者は相対パスであり、後者は絶対パスであることです。どちらの場合も、that-script
コマンドラインを呼び出したシェルプロセスの現在の作業ディレクトリにない場合は失敗します。cron
デフォルトでは、タスクはcrontab
通常ホームディレクトリから開始されます。
そのディレクトリにない場合はthat-script
を使用してください/actual/path/to/that-script
。スクリプトが現在の作業ディレクトリで実行されているかどうかも重要であるため、/actual/path/to
次のことができます。
cd /actual/path/to && ./that-script
または:
cd /actual/path/to && "$PWD/that-script"
実行する場合は、that-script
両方のanother-script
スクリプトが同じディレクトリにあります。通常、$0
in値からディレクトリを派生できますother-script
。
たとえば、スクリプトother-script
の場合zsh
:
bash -- $0:h/that-script
そうではなく、$0
改行で終わらないと仮定すると、次のようになります。
bash -- "$(dirname -- "$0")/that-script"
ディレクトリ名は$0
相対パスにすることができます。絶対パスにするには、zshで次のようにします。
bash -- $0:P:h/that-script
その他のシェル:
dir=$(CDPATH= cd -P -- "$(dirname -- "$0")" && pwd -P) || exit
bash -- "$dir/that-script"
答え2
pwd
現在のディレクトリに戻ります。これを行うたびにcd somedir
結果がpwd
変わります。
これにより、/bin/bash "$(pwd)/Testing_3.sh"
起動時に正しく動作します。する
echo "$(pwd)/Testing_3.sh"
結果はcrontabで使用する必要がある文字列です。
答え3
Kusalanandaが投稿したリンクを参照した後、次の解決策が見つかりました。
/bin/bash "$(dirname "$0")/Testing_3.sh"
$(ディレクトリ名 "$0")crontabを介して実行されるbashスクリプトでうまく動作します。