我听说printf比echo. 根据我的经验,我只能回忆起一个我不得不使用的实例,printf因为它echo无法将一些文本输入到 RHEL 5.8 上的某个程序中,但printf确实如此。但显然,还有其他差异,我想询问它们是什么以及是否有特定情况下何时使用一种与另一种。
所有 shell 内置函数共享相同的手册页:
BUILTIN(1) BSD General Commands Manual BUILTIN(1)
NAME
builtin, !
Run Code Online (Sandbox Code Playgroud)
等等。
然后有一小段文字描述了什么是 shell 内置函数,然后是一个看起来像这样的列表:
Command External csh(1) sh(1)
! No No Yes
% No Yes No
Run Code Online (Sandbox Code Playgroud)
但是如果我们这样做,man grep我们会得到诸如
等等。
难道 shell 内置函数没有自己的历史、描述和参数,比如-A或-r?为什么手册页中没有提供,我将如何学习正确有效地使用它们?
如何正确运行一些更改了IFS变量值的命令(以更改字段拆分的工作方式和"$*"处理方式),然后恢复 的原始值IFS?
我知道我能做到
(
IFS='my value here'
my-commands here
)
Run Code Online (Sandbox Code Playgroud)
将 的更改本地化IFS到子外壳,但我真的不想启动子外壳,尤其是如果我需要更改或设置需要在子外壳之外可见的变量的值时更是如此。
我知道我可以使用
saved_IFS=$IFS; IFS='my value here'
my-commands here
IFS=$saved_IFS
Run Code Online (Sandbox Code Playgroud)
但IFS在原始IFS实际上未设置的情况下,这似乎无法正确恢复。
寻找与 shell 无关(但 POSIX)的答案。
澄清:上面的最后一行意味着我对bash-exclusive 解决方案不感兴趣。事实上,我使用最多的系统 OpenBSDbash在默认情况下甚至根本没有安装,而且bash它不是我用来回答本网站问题以外的任何其他事情的外壳。看到我可以在bash或其他类似 POSIX 的 shell 中使用的解决方案更有趣,而无需努力编写不可移植的代码。
在 CentOS 上,rename 命令使用两个简单的字符串,from以及to.
rename from to file...
Run Code Online (Sandbox Code Playgroud)
而在 Debian/Ubuntu 上,它使用 perl 风格的正则表达式。
rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]
Run Code Online (Sandbox Code Playgroud)
为什么此实用程序因分布而异?是否有关于哪些发行版发布或默认使用该实用程序的哪些版本的参考?
在 bash 脚本的顶部eu之后是什么意思#!/bin/bash -eu?
通常我用这个hashbang/shebang开始我的 bash 脚本:
#!/bin/bash
Run Code Online (Sandbox Code Playgroud)
但我只是遇到了一个
#!/bin/bash -eu
Run Code Online (Sandbox Code Playgroud)
我不知道为什么有一个-eu那里。阅读这些man bash页面似乎对我没有帮助,但也许我忽略了一些东西。
不是重复的:
这不是使用 `set -eu` 时 EXIT 和 ERR 陷阱的正确行为的重复。
在这个问题下面的评论中引用@ilkkachu,直接解决这个问题:
... -e 和 -u 如何处理陷阱或其他任何东西与它们和其他单字符选项在命令行上的给出方式完全无关。
我同意这一点。这些是不同的问题和答案,背后有着不同的动机。这个问题是如此不同,我什至在尝试理解我自己的问题的答案时,都不会想通过查看它的标题或描述来点击它,而且答案也大不相同。