顺便说一句,我./今天在运行 ARM linux 的 sh shell 中输入了一个错误,它产生了“权限被拒绝”作为错误,而不是“是一个目录”,这是通常的错误。
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
Run Code Online (Sandbox Code Playgroud)
bash 中的 Debian Jessie:
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
Run Code Online (Sandbox Code Playgroud)
我知道我正在尝试执行一个目录,但我很好奇:为什么 sh 会产生权限错误?
如果我猜想,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
Run Code Online (Sandbox Code Playgroud)
bash可能会检查路径是否为目录。当然,这会稍微慢一些,并且代码会稍微长一些。
bash,zsh等进行检查的原因不止一个 - 它们允许您“运行”指向目录的路径cd:
$ shopt -s autocd
$ cd /
$ pwd
/
$ /usr/share
cd /usr/share
$ pwd
/usr/share
Run Code Online (Sandbox Code Playgroud)
在dash(Debian/bin/sh指向/bin/dash)的情况下,情况几乎就是这样。执行命令的代码在shellexec():
$ 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
Run Code Online (Sandbox Code Playgroud)
该函数调用errms():
$ shopt -s autocd
$ cd /
$ pwd
/
$ /usr/share
cd /usr/share
$ pwd
/usr/share
Run Code Online (Sandbox Code Playgroud)
strerror(3)是另一个标准函数,例如perror. strerror返回错误信息,perror直接打印出来。
| 归档时间: |
|
| 查看次数: |
1132 次 |
| 最近记录: |