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

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

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

おすすめ記事