考虑以下:
$ ksh -c '1(){ echo hi;};1'
ksh: 1: invalid function name
$ dash -c '1(){ echo hi;};1'
dash: 1: Syntax error: Bad function name
$ bash -c '1(){ echo hi;};1'
bash: `1': not a valid identifier
bash: 1: command not found
$ mksh -c '1(){ echo hi;};1'
hi
Run Code Online (Sandbox Code Playgroud)
基本上,我试图声明函数1,0这将是trueand 的简写false,但是正如您所看到的,我在函数中使用数字名称时遇到了问题。别名和两位数名称也会发生相同的行为。
问题是“为什么”?它是 POSIX 强制要求的吗?或者只是像伯恩一样的贝壳的怪癖?
在浏览/proc/self我的mkshshell 的文件夹时,我发现了一个奇怪的事情:在/proc/self/fd/*所有的标准文件描述符中(0 表示标准输入,1 表示标准输出,2 标准错误)一些文件描述符,还有一些额外的 - 24、25、3 . 从技术上讲,我可以在 shell 中使用 glob 列出它们:
$ for fd in /proc/self/fd/* ; do echo $fd ; done
/proc/self/fd/0
/proc/self/fd/1
/proc/self/fd/2
/proc/self/fd/24
/proc/self/fd/25
/proc/self/fd/3
Run Code Online (Sandbox Code Playgroud)
但是当我尝试stat使用它们或使用find它们时,它们被报告为不存在。
$ find /proc/self/fd/*
/proc/self/fd/0
/proc/self/fd/1
/proc/self/fd/2
find: ‘/proc/self/fd/24’: No such file or directory
find: ‘/proc/self/fd/25’: No such file or directory
/proc/self/fd/3
Run Code Online (Sandbox Code Playgroud)
同样发生在bash,但只有一个辅助文件描述符。
$ for fd in /proc/self/fd/* ; do echo $fd; done
/proc/self/fd/0
/proc/self/fd/1
/proc/self/fd/2
/proc/self/fd/255
/proc/self/fd/3 …Run Code Online (Sandbox Code Playgroud) 例如,以下命令不起作用:
if [[-e xyz]]; then echo File exists;fi
Run Code Online (Sandbox Code Playgroud)
ksh 给出以下错误
[[-e: command not found
Run Code Online (Sandbox Code Playgroud)
那是因为“[[-”不明确吗?
我需要了解一些 ksh 细节,但我不想永久地从 bash 更改为 ksh。
我该怎么办?
是否可以仅为特定的控制台会话更改 shell?