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"
알려진 값이 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)