ソースファイルの機能内ではファイル生成は行われません。

ソースファイルの機能内ではファイル生成は行われません。

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"

既知の値がdrtaで始まらない場合は、このパラメータを安全に省略できます---あなたの場合には統制権を持っているようで、$drtこれはかなり安全な賭けのようです。

すぐに()または1分後()atなど、より速い時間に実行するようにスケジュールしてコマンドをテストするのが便利な場合があります。at nowat 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時間。

結論として

私のようなコードで作業するときに上記のコード例のようなパラダイムで作業している場合は、スケジュールしたいコマンドをatecho ""do X at now + y time (from now)

関連情報