考虑到 POSIX 是所有 unices 中最接近通用标准的东西,我很想知道是否有专门支持它的 shell。尽管大多数现代 shell 都提供对 POSIX 的支持(并且可以毫无问题地运行 POSIX 兼容脚本),但它们在指出不兼容的功能方面做得不好。
是否有任何仅实现 POSIX 和 POSIX 的外壳程序,它会为任何不兼容的功能抛出错误?
编辑我想澄清一下,我不是要求编写可移植 shell 脚本的一般提示。评论中提到的相关问题已经涵盖了这一点。当我发现bash
有一个--posix
选项时,我想到了这个问题,但只是发现它只影响一些初始化行为,这并不是我正在寻找的。
我有一个shell脚本,多数民众赞成从标准输入读取。在极少数情况下,没有人准备好提供输入,脚本必须超时。在超时的情况下,脚本必须执行一些清理代码。这样做的最佳方法是什么?
这个脚本必须非常便携,包括到 20 世纪没有 C 编译器的 unix 系统和运行 busybox 的嵌入式设备,所以不能依赖 Perl、bash、任何编译语言,甚至完整的 POSIX.2。特别是$PPID
,read -t
完全符合POSIX标准的和陷阱不可用。写入临时文件也不包括在内;即使所有文件系统都以只读方式安装,脚本也可能运行。
只是为了让事情变得更困难,我还希望脚本在没有超时时能够相当快。特别是我也在Windows(主要是Cygwin)中使用了脚本,其中fork和exec特别低,所以我想尽量减少它们的使用。
简而言之,我有
trap cleanup 1 2 3 15
foo=`cat`
Run Code Online (Sandbox Code Playgroud)
我想添加一个超时。我不能cat
用read
内置替换。在超时的情况下,我想执行该cleanup
功能。
背景:该脚本通过打印一些 8 位字符并比较前后光标位置来猜测终端的编码。脚本的开头测试 stdout 连接到支持的终端,但有时环境是谎言(例如,即使使用 调用它也会plink
设置TERM=xterm
TERM=dumb
)。脚本的相关部分如下所示:
text='Éé' # UTF-8; shows up as Ãé on a latin1 terminal
csi='?['; dsr_cpr="${csi}6n"; dsr_ok="${csi}5n" # ? is an escape character
stty_save=`stty -g`
cleanup () { …
Run Code Online (Sandbox Code Playgroud) 我想运行一个包含循环的 shell 脚本,它可以永远运行,而我不想发生这种情况。所以我需要为整个脚本引入一个超时时间。
如何在 SuSE 下为整个 shell 脚本引入超时?