Ubuntu 16.04 xenial と Bash 4.3.48レンプ、私はコンフォート機能作るPHP情報ファイル(私のPHP環境をよりよく理解するために)2時間後に削除します。しかし、端末から関数を呼び出すのに問題があります。
私の問題を再現するステップ
1)関数を使用してファイルを作成します。
#!/bin/bash
drt="/var/www/html"
pif() {
cat > "$drt"/info.php <<< "<?php phpinfo();"
rm "$drt"/info.php | at now + 2 hours
}
2)このファイルのソースを入手してください。
三)端末でこの関数を呼び出します。
pif
info.php
残念ながら、同じ名前のファイルは生成されませんでした/var/www/html
。私はこれをもう一度確認しました。
以下は、この方法で関数を実行した完全なトレースです(pif
)。
+ pif
+ cat
+ at now + 2 hours
+ rm /var/www/html/info.php
warning: commands will be executed using /bin/sh
job 17 at Fri Apr 6 05:43:00 2018
一方、関数でファイルを生成したくない場合は、次のようにします。
cat > "$drt"/info.php <<< "<?php phpinfo();"
ファイルが正常に作成されました。
私の質問
端末での直接実行は機能しますが、コードを含む関数の実行が失敗するのはなぜですか?
修正する
1)私には書き込み権限があります/var/www/html
。
2)以下からファイルを取得します。
source myFunctions.sh
三)出力はtype -a pif
次のとおりです
pif is a function
pif ()
{
cat > "$drt"/info.php <<< "<?php phpinfo();";
rm "$drt"/info.php | at now + 2 hours
}
答え1
関数は生成されますが、info.php
すぐに削除されます。
ファイルを作成したら、info.php
次のコマンドを使用したいようです。スケジュール削除:
rm "$drt"/info.php | at now + 2 hours
しかしそれは真実ではない。それ走るrm
今命令して、それから管路それ標準出力(通常は何も記録されず、基本的rm
に自動的に成功します)at
標準入力。
このシェル機能がファイルの削除をスケジュールする必要がある場合は、標準at
入力にコマンドをテキストとして提供するか、ファイルを削除する別のスクリプトを実行するコマンドをスケジュールする必要があります。バラより1から)実行するコマンドをスケジュールする方法の詳細at
。
追跡で実際に何が起こっているのかを確認できます。
+ at now + 2 hours
+ rm /var/www/html/info.php
パイプラインのコマンドは非同期的に実行されます。トレースは、.で区切られた2つのコマンドをシェルに実行すると正常に機能することを示しています|
。そのコマンドからパイプデータをat
受信できるように、パイプの右側に表示されるコマンドを実行します。次にすぐにコマンドをrm
実行します。rm
これを行うと、rm
コマンドはファイルを削除します。これを防ぐには、at
後でコマンドを実行するように指示する必要があります。いいえ今パイプラインで実行してみてください。
drt
(あなたの例では)値に特別に扱われる/var/www/html
スペースや他の文字が含まれていない場合/bin/sh
(コマンドを実行するために)現在持っているものと似たものを使用したい場合は、次のようにします。at
at now + 2 hours <<<"rm -- $drt/info.php"
既知の値がdrt
aで始まらない場合は、このパラメータを安全に省略できます-
。--
あなたの場合には統制権を持っているようで、$drt
これはかなり安全な賭けのようです。
すぐに()または1分後()at
など、より速い時間に実行するようにスケジュールしてコマンドをテストするのが便利な場合があります。at now
at now + 1 minute
答え2
私は賛成すべきだと思うEliahの答えを受け入れました。しかし、これは私が特別に使用するいくつかの異なるコードに関して私が自分で作った説明です。
上記のコードが誤った理由:
私のコマンドが欠けているようですecho
。
私の元のコマンドを考えてみましょう。
rm "$drt"/info.php | at now + 2 hours
rm
ファイルを作成して直接実行した後、それまで、空の実行at
。
より簡単な図では、次のようになります。
1)この文字列を使用してphpinfoを作成します。
2)phpinfoを削除します
rm
(もう何もパイプされません)。三)2時間待ちます(この場合は結果なし)。
正しいコード
私がしなければならないことは次のとおりです(うまくいきます。もう一度確認しました)。
echo "rm $drt/info.php" | at now + 2 hours
このコマンドの概略図は次のとおりです。
1)この文字列を使用してphpinfoを作成します。
2)コマンドをエコー
rm
しますが、出力をecho
次の(at
)コマンドにパイプします。三)
rm
今+2時間。
結論として
私のようなコードで作業するときに上記のコード例のようなパラダイムで作業している場合は、スケジュールしたいコマンドをat
。echo ""
do X at now + y time (from now)