我想知道是否有通过 shebang 行 ( #!)将多个选项传递给可执行文件的通用方法。
我使用 NixOS,在我编写的任何脚本中,shebang 的第一部分通常是/usr/bin/env. 然后我遇到的问题是系统将其后的所有内容解释为单个文件或目录。
例如,假设我想编写一个脚本以bash在 posix 模式下执行。写shebang的天真方式是:
#!/usr/bin/env bash --posix
Run Code Online (Sandbox Code Playgroud)
但是尝试执行生成的脚本会产生以下错误:
/usr/bin/env: ‘bash --posix’: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我知道这篇文章,但我想知道是否有更通用和更清洁的解决方案。
编辑:我知道对于Guile脚本,有一种方法可以实现我想要的,在手册的第 4.3.4 节中记录:
#!/usr/bin/env sh
exec guile -l fact -e '(@ (fac) main)' -s "$0" "$@"
!#
Run Code Online (Sandbox Code Playgroud)
这里的技巧是,第二行(以 开头exec)被解释为代码,sh但是,在#!...!#块中,作为注释,因此被 Guile 解释器忽略。
难道不能将此方法推广到任何解释器吗?
第二次编辑:在玩了一会儿之后,似乎对于可以从中读取输入的解释器,stdin以下方法可以工作:
#!/usr/bin/env sh
sed '1,2d' "$0" | bash --verbose --posix …Run Code Online (Sandbox Code Playgroud) most 寻呼机很好,但它的默认键绑定与其他任何键绑定都不一样。
由于我不想为我的寻呼机学习一套全新的键绑定(无论它多么花哨和美妙),有没有办法让most热键感觉更像vi,less以及其他?
在mutt 中,是否可以使用vifm或ranger等文件浏览器(可能在tmux拆分中)而不是默认文件浏览器来选择要附加到电子邮件的文件?
我想知道是否存在bash以某种方式打印字符串的命令,以公开它包含的特殊字符。
例如,假设a=$'\a\0\b\e'; 是否存在\a\0\b\e从字面上打印的函数$a?
到目前为止,我最接近的是使用以下l命令sed:
echo "$a" | sed -n 'l'
Run Code Online (Sandbox Code Playgroud)
它返回\a\000\b\033$,但表示法与内部的表示法不同,$''如果字符串包含换行符,则不起作用。
我很难理解以下命令的效果:
yes | tee hello | head
Run Code Online (Sandbox Code Playgroud)
在我的笔记本电脑上,“hello”中的行数约为 36000 行,远高于标准输出上显示的 10 行。
我的问题是:
yes,以及更一般地说,管道中的命令何时停止?
为什么上面两个数字不匹配。是因为tee没有将行一一传递到管道中的下一个命令吗?