
저는 CentOS 공유 서버 환경과 Bash를 사용하고 있습니다.
ll "$HOME"/public_html/cron_daily/
가져오다:
./
../
-rwxr-xr-x 1 user group 181 Jul 11 11:32 wp_cli.sh*
왜 파일 이름 끝에 별표가 있는지 모르겠습니다. 추가한 기억이 없고 변경하려고 하면 다음과 같은 결과가 나타납니다.
[~/public_html]# mv cron_daily/wp_cli.sh* cron_daily/wp_cli.sh
+ mv cron_daily/wp_cli.sh cron_daily/wp_cli.sh
mv: `cron_daily/wp_cli.sh' and `cron_daily/wp_cli.sh' are the same file
이 오류는 내 Cpanel cronjob이 실패한 이유를 나타낼 수 있습니다.
파일을 변경하거나 Cpanel cron 명령을 실행할 때 제가 뭔가 잘못하고 있는 걸까요? 두 작업 모두 실패한 것 같기 때문입니다.
답변1
별표는 실제로 파일 이름의 일부가 아닙니다. 파일이 실행 가능하고 별칭에 ll
다음 플래그가 포함되어 있기 때문에 표시됩니다 -F
.
-에프
각 디렉터리 경로 이름 바로 뒤에 슬래시('/')를 표시하고, 각 실행 파일 뒤에는 별표('*')를 표시하고, 각 기호 링크 뒤에는 at 기호('@')를 표시합니다. 각 디렉터리 경로 이름 뒤에는 등호(`=')가 나타납니다. 심볼릭 링크), 각 소켓 뒤에는 퍼센트 기호('%'), 각 공백 뒤에는 퍼센트 기호('%'), 각 FIFO 표현 뒤에는 세로 막대('%')가 있습니다.
Kusalananda가 언급했듯이 이와 같은 cron을 사용하여 디렉터리의 모든 스크립트를 반복할 수는 없습니다. 실행 부분을 사용하면 "$HOME"/public_html/cron_daily/
실행 디렉터리(.sh뿐만 아니라)의 모든 스크립트를 호출하거나 다음에 설명된 대로 반복할 수 있습니다.이 게시물.
답변2
Jesse_b이 질문은 이미 답변되었지만 잠재적인 오해를 해결할 가치가 있다고 생각했습니다.
쉘의 문자는 특정 조건에서 특별한 의미를 갖습니다. 예: |
파이프, >
리디렉션, \
이스케이프 문자 등에 사용됩니다. 이러한 문자는 셸에서 문자 그대로 해석되지 않으므로 이 작업을 수행하면 echo foo>bar
터미널 foo>bar
에 인쇄되는 대신 파일 foo
로 리디렉션됩니다 .bar
다행스럽게도 셸에는 이러한 문자가 특별한 의미인 따옴표를 잃게 만드는 메커니즘도 있습니다. POSIX 쉘에서는3가지 인용 메커니즘이 있습니다.:
- 백슬래시
\
:후속 문자의 리터럴 값은 유지되지만<newline>
. - 큰따옴표
"..."
:`
,$
및 문자를 제외하고 큰따옴표 안에 있는 모든 문자의 리터럴 값을 유지합니다\
. - 아포스트로피
'...'
:예외 없이 작은따옴표 안에 있는 모든 문자의 리터럴 값을 유지합니다.
따라서 이전 예에 따라 문자 그대로 인쇄하려면 foo>bar
다음과 같이 할 수 있습니다.
echo foo\>bar
echo "foo>bar"
echo 'foo>bar'
별표는 *
이러한 특수 문자 중 하나입니다.패턴 일치 기호그리고 사용파일 이름 확장자. 즉, 다음과 같은 명령은 echo *.txt
패턴을 패턴과 일치하는 파일로 바꿉니다.
귀하의 경우 cron_daily/wp_cli.sh*
match 만 있으므로 2개의 동일한 매개변수를 cron_daily/wp_cli.sh
보고 mv
이에 대해 불평합니다. 파일이 없기 때문에 상관없습니다 cron_daily/wp_cli.sh*
. 그러나 실제 파일이 있고 cron_daily/wp_cli.sh*
패턴과 일치할 수 있는 파일이 더 많으면 mv
실패합니다.
다음 시나리오를 고려해보세요.
$ ls -l
total 0
-rw-rw-r-- 1 user group 0 jul 14 12:00 file*
-rw-rw-r-- 1 user group 0 jul 14 12:00 file1
-rw-rw-r-- 1 user group 0 jul 14 12:00 file2
-rw-rw-r-- 1 user group 0 jul 14 12:00 file3
file*
따옴표 없이 이름을 바꾸려고 하면 다음과 같습니다 .
$ mv file* new_file
mv: target 'new_file' is not a directory
이는 수신된 매개변수 mv
이므로 new_file
디렉토리가 필요하기 때문입니다.
$ printf '[%s]\n' file* new_file
[file*]
[file1]
[file2]
[file3]
[new_file]
이름을 성공적으로 바꾸려면 file*
매개변수를 인용해야 합니다.
$ mv 'file*' new_file
$ ls -l
total 0
-rw-rw-r-- 1 user group 0 jul 14 12:00 file1
-rw-rw-r-- 1 user group 0 jul 14 12:00 file2
-rw-rw-r-- 1 user group 0 jul 14 12:00 file3
-rw-rw-r-- 1 user group 0 jul 14 12:00 new_file