.bashrc
와 사이의 차이점을 확인하려고 시도하는 동안 PHP가 아닌 SSH에서만 읽혀지고 읽히지 않는다는 .bash_profile
것을 알았습니다 . 이는 의 정보와 모순되는 것 같습니다 . 왜 이런 일이 발생하는지 설명해 줄 수 있나요? 서버가 CentOS 5 변형인 것으로 보입니다..bashrc
.bash_profile
man bash
local$ ssh user@server
Last login: Wed Jan 23 23:21:23 2013 from 1.2.3.4
$ cat .bashrc
alias br='echo fromBR'
$ cat .bash_profile
alias bp='echo fromBP'
$ br
-bash: br: command not found
$ bp
fromBP
$ cat public_html/bashtest.php
<?php
echo "hello\n";
echo shell_exec('bp');
echo shell_exec('br');
?>
$ php public_html/bashtest.php
hello
sh: bp: command not found
sh: br: command not found
$ wget server/bashtest.php
23:35:13 (759.55 KB/s) - `bashtest.php' saved [7/7]
$ cat bashtest.php
hello!
따라서 CLI에서만 .bashrc
읽혀지지 않는 것처럼 보입니다 (사용자 CLI의 PHP나 Apache를 통해서는 읽혀지지 않음). .bash_profile
또한 Apache를 통해 "명령을 찾을 수 없음" 텍스트도 반환되지 않습니다!
이것이 예상되는 동작입니까(즉, 제가 잘못 이해하고 있는 것입니까 man bash
?) 아니면 뭔가 잘못된 것입니까?
답변1
우선, PHP는 귀하의 예제에서 이를 수행하지 않고 있으며 , shell_exec
이는 정확한 오류 메시지에서 매우 분명합니다. 그래요bash
sh
추측하다이것은 웹 서버가 실행되는 사용자로 /etc/passwd에 지정된 쉘에 의해 제어되며, shell_exec는 stderr을 캡처하지 않으며, 명령줄에서 PHP를 실행하면 ${shell로 종료됩니다. }. sh로 시작하면 bash는 원래 sh 쉘의 동작을 더 잘 모방하기 위해 많은 기능을 끕니다. 다른 이유가 없다면 .bashrc
이러한 파일의 소스는 거의 확실히 .bash_profile
그 중 하나입니다. 이러한 파일은 bash 특정 구문이나 확장을 사용할 수 있기 때문입니다.
SSH에 대해서는 잘 모르겠지만 간단한 $
힌트를 통해 sh를 실행하고 있을 가능성이 높으며 이는 현재 보고 있는 동작을 설명합니다. echo ${SHELL}
실제로 무엇이 붙어 있는지 확인 하십시오 . 이것은 모든 쉘에서 작동합니다.
그 의미는, 제 생각에는 PHP 스크립트에서 bash 별칭에 의존하는 것은 매우 나쁜 생각입니다. 수행하려는 작업이 너무 길어서 명령문 shell_exec
자체에 적합하지 않은 경우(매우 신중하게 사용해야 함) 인수에서 명령줄을 생성하는 PHP 함수를 생성하고 이를 호출하는 것이 거의 확실하게 더 나은 접근 방식입니다. 그것은 효과가 있을 것이다에도 불구하고선택할 쉘이나 구성 방법을 설치하십시오. 또는 bash로 작성하고 해당 인터프리터로 /bin/bash를 지정할 수 있는 외부 스크립트 파일을 호출하는 것을 고려하십시오. 그러나 귀하의 애플리케이션은 bash 설치를 요청할 것입니다(bash 별칭에 의존하는 경우 이미 설치되어 있을 수 있습니다...).