在mkdir命令中,verbose选项是什么意思?

4

我正在学习一本关于Shell (Bash)脚本编程的入门书籍,发现mkdir命令的手册中描述了一个详细选项,它会在创建目录时显示一条消息:

-v, --verbose
       print a message for each created directory

看起来mkdir -v有一个预定义的消息它会打印出来。有没有办法打印自定义的消息?是否有一种方法可以永久地设置自定义消息而不是默认消息?

4个回答

5

以下是处理-v选项的部分,来自mkdir.c的源代码:

    case 'v': /* --verbose  */
      options.created_directory_format = _("created directory %s");
      break;

正如您所看到的,使用的字符串是硬编码到源代码中的。要永久更改消息为自定义消息,可以修改源代码的此部分并重新编译mkdir


4
_(...) 表示它并不是严格的硬编码。而是在硬编码源字符串上执行 gettext 查找,实际打印出来的是该查找的结果。 - tripleee

3
您可以创建一个像这样的脚本:
#/bin/bash

/bin/mkdir "$@" |sed -e"s/mkdir: created directory /$USER created folder /"

运行该脚本而不是mkdir。

通过向sed添加额外的-e“s / x / y”来修改每个要更改的消息的脚本。

如果您坚持要将其命名为mkdir,则可以在mkdir之前将其放入搜索路径中。

我不建议将其命名为mkdir。这只会给调用mkdir的其他脚本带来麻烦。


该消息被打印到标准错误输出,因此您的 sed 没有看到 mkdir 的输出。 - tripleee
此外,你应该始终使用双引号 "$@" - tripleee
Debian 6.0.10,Coreutils 8.5。 - tripleee
@tripleee:你能在Debian上测试我的脚本吗?测试你的脚本并不能确定详细信息是否从stderr输出。感谢你关于引用$@的提示。有趣的是,Bash实际上会为数组中的每个元素添加引号。我的直觉是引号会将所有元素放入一个字符串中。 - Be Kind To New Users
1
对不起,你是正确的,我第一次可能打错了什么。 - tripleee
显示剩余2条评论

2
如果您对包装器感到满意,可以尝试类似以下的内容。
mkdir -v "$@" | sed 's/mkdir: created directory /jar-jar: yea, weesa gotta /'

更基本的是,在mkdir中的消息字符串通常是硬编码的。但是,如果有本地化支持,您实际上可以使用自己的消息目录覆盖消息目录。
例如,如果您的mkdir是使用gettext构建的,您可以创建一个新的英文.po文件,替换目录创建消息,构建一个新的区域设置,并运行它。请参见http://translationproject.org/domain/coreutils.html 根据您的需求,这在严重过度和疯狂之间。

1

你试过用这个标志来运行它吗?

lgml-alfasi2:dotfiles alfasi$ mkdir -v tp
mkdir: created directory 'tp'  <-- see why it is called 'verbose' ?
lgml-alfasi2:dotfiles alfasi$

来自男子的话:

-v      Be verbose when creating directories, listing them as they are created.

所以对于你的另一个问题:不,你不能“定制”预定义的消息。
话虽如此,这是一个开源项目,如果你有兴趣,可以创建自己的fork,提交PR等:http://opensource.apple.com/source/file_cmds/file_cmds-212/mkdir/mkdir.c

1
该链接是指向OSX源代码(基本上是BSD),而不是Linux(即GNU coreutils)。 - tripleee
1
@tripleee 你是对的,谷歌显示了多个版本的mkdir,例如http://www.jbox.dk/sanos/source/cmds/mkdir.c.html。 - Nir Alfasi
2
权威来源为http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/mkdir.c - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接