소스 파일의 기능 내에서는 파일 생성이 발생하지 않습니다.

소스 파일의 기능 내에서는 파일 생성이 발생하지 않습니다.

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

파이프라인의 명령은 비동기적으로 실행됩니다. 추적은 .로 구분된 두 개의 명령을 셸에 실행하면 정상적으로 작동함을 보여줍니다 |. 해당 명령에서 파이프된 데이터를 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시간.

결론적으로

나와 유사한 코드로 작업할 때 위의 코드 예제와 같은 패러다임으로 작업하는 경우 예약하려는 명령을 at.echo ""do X at now + y time (from now)

관련 정보