아주 우연하게도 ./
오늘 ARM Linux를 실행하는 sh 셸을 입력하고 있었는데 일반적인 "디렉토리입니다" 오류 대신 "권한 거부됨" 오류가 발생했습니다.
sh의 ARM Linux:
[root@zynq DEBUG]# ./
-sh: ./: Permission denied
[root@zynq DEBUG]# uname -a
Linux zynq 3.8.0-xilinx #1 SMP PREEMPT Mon May 19 13:01:00 PDT 2014 armv7l GNU/Linux
[root@zynq DEBUG]# echo $SHELL
/bin/sh
Bash의 데비안 제시:
root@hotbox:~# ./
bash: ./: Is a directory
root@hotbox:~# uname -a
Linux hotbox 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt9-3~deb8u1 (2015-04-24) x86_64 GNU/Linux
root@hotbox:~# echo $SHELL
/bin/bash
디렉토리를 실행하려고 한다는 것은 알지만 궁금합니다. 왜 sh에서 권한 오류가 발생합니까?
답변1
추측컨데, 여러분은 sh
사용자 친화성보다 단순성이나 성능을 선호하는 것 같습니다. "권한 거부" 오류는 다음으로 인해 발생합니다.perror(3)
, 오류 메시지 인쇄를 위한 표준 기능입니다. 예를 들어:
$ cat foo.c
#include <stdio.h>
#include <unistd.h>
int main()
{
char* const args[] = { "/usr", NULL };
if (execv(args[0], args))
perror(args[0]);
return 0;
}
$ gcc -o foo foo.c
$ ./foo
/usr: Permission denied
bash
경로가 디렉터리인지 확인할 수 있습니다. 물론 이 경우 약간 느려지고 코드도 약간 길어집니다.
bash
등에 는 zsh
확인해야 할 이유가 두 가지 이상 있습니다. 이를 통해 디렉토리 경로를 "실행"할 수 있습니다 cd
.
$ shopt -s autocd
$ cd /
$ pwd
/
$ /usr/share
cd /usr/share
$ pwd
/usr/share
dash
(데비안이 /bin/sh
지적하는) 한 /bin/dash
그것은 거의 사실입니다. 명령을 실행하는 코드는 다음 위치에 있습니다.shellexec()
:
if (strchr(argv[0], '/') != NULL) {
tryexec(argv[0], argv, envp);
e = errno;
} else {
// snip
exerror(EXEXIT, "%s: %s", argv[0], errmsg(e, E_EXEC));
이 함수는errms()
:
const char *
errmsg(int e, int action)
{
if (e != ENOENT && e != ENOTDIR)
return strerror(e);
if (action & E_OPEN)
return "No such file";
else if (action & E_CREAT)
return "Directory nonexistent";
else
return "not found";
}
strerror(3)
예를 들어 또 다른 표준 함수는 perror
오류 strerror
정보를 반환하고 perror
이를 직접 인쇄합니다.