Bash スクリプトがエラーなしで他のスクリプトを呼び出すことができない

Bash スクリプトがエラーなしで他のスクリプトを呼び出すことができない

起動時に init.d スクリプトから呼び出される bash スクリプトがあります。このスクリプトを複数回再起動する必要があるため、スクリプトが動作するかどうかを確認するために使用される中間ファイルを作成しています。問題は、init.d スクリプト (bash については初心者なので、これが技術的にスクリプトと呼ばれるかどうかはわかりません) によって呼び出されるスクリプトで、その「スクリプト」が実際の作業を行う別のスクリプトを呼び出しますが、実行されず、エラーも生成されないことです。それは checkversion.sh arg1 arg2 です。stderr 出力をエラーが発生しないファイルにパイプしました。意図的に間違ったファイル パスを入力するとエラーが発生します。スクリプトの呼び出し後に使用された出力ファイルがいくつかあり、それらが正しく設定されてアクセスされていることがわかります。何か明らかなことを見落としているのでしょうか?

基本構造: /etc/init.d/myupdate は /usr/bin/databases/runcheckversion.sh を呼び出し、最終的に /usr/bin/databases/checkversion.sh を呼び出しますが、checkversion.sh は実行されず、エラーは出力されません。これは PATH 指定に関係していると考えられますか?

/etc/init.d/myupdate コード:

#! /bin/sh
### BEGIN INIT INFO
#Provides: myupdate
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin

case "$1" in
    start)
         /usr/bin/databases/runcheckversionwithupdate.sh
         ;;
    stop|restart|reload)
         ;;
esac

/usr/bin/databases/runcheckversion.sh コード:

#! /bin/sh

after_reboot()
{
   versionNumber=$(< /usr/bin/databases/afterreboot.txt);
   #This following command never executes and theres no error output
   sudo /usr/bin/databases/checkversion.sh $versionNumber /usr/bin/databases/my.db.sqlite 2> didntwork.txt 
  ((versionNumber++));
  echo $versionNumber>/usr/bin/databases/afterreboot.txt;  
}




if [ -f /usr/bin/databases/afterreboot.txt ]; then
    sleep 20
    after_reboot
    checkVersion=$(< /usr/bin/databases/afterreboot.txt)
    if(($checkVersion < 2)); then
    sudo reboot
    fi
    echo "DONE"
else
  echo "1">/usr/bin/afterreboot.txt;
  echo "worked"
  sudo reboot
fi

答え1

after_reboot() 関数を呼び出す前に存在を確認するファイルは次のとおりです: /usr/bin/databases/afterreboot.txt

ただし、1 をエコーするファイル (上記のファイルが存在しない場合) は /usr/bin/afterreboot.txt です。

つまり、1 つのファイル (/usr/bin 内) を作成し、別のファイル (/usr/bin/databases 内) をチェックしているように見えます。

次の方法が機能する可能性があります:

#! /bin/sh

after_reboot()
{
   versionNumber=$(< /usr/bin/databases/afterreboot.txt);
   #This following command never executes and theres no error output
   sudo /usr/bin/databases/checkversion.sh $versionNumber /usr/bin/databases/my.db.sqlite 2> didntwork.txt 
  ((versionNumber++));
  echo $versionNumber>/usr/bin/databases/afterreboot.txt;  
}




if [ -f /usr/bin/databases/afterreboot.txt ]; then
    sleep 20
    after_reboot
    checkVersion=$(< /usr/bin/databases/afterreboot.txt)
    if(($checkVersion < 2)); then
    sudo reboot
    fi
    echo "DONE"
else
  echo "1">/usr/bin/databases/afterreboot.txt;
  echo "worked"
  sudo reboot
fi

関連情報