sh에 "./"를 입력하면 "Permission Denied"가 발생하는 이유는 무엇입니까?

sh에 "./"를 입력하면 "Permission Denied"가 발생하는 이유는 무엇입니까?

아주 우연하게도 ./오늘 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이를 직접 인쇄합니다.

관련 정보