【发布时间】:2015-04-12 18:54:26
【问题描述】:
我正在阅读Shell (Bash) Scripting 的入门知识,并注意到mkdir 的联机帮助页描述了一个详细选项,该选项会在创建目录时显示一条消息:
-v, --verbose print a message for each created directory
似乎mkdir -v 打印了一条预定义的消息。有没有办法打印自定义消息?有没有办法永久设置自定义消息而不是默认消息?
【问题讨论】:
我正在阅读Shell (Bash) Scripting 的入门知识,并注意到mkdir 的联机帮助页描述了一个详细选项,该选项会在创建目录时显示一条消息:
-v, --verbose print a message for each created directory
似乎mkdir -v 打印了一条预定义的消息。有没有办法打印自定义消息?有没有办法永久设置自定义消息而不是默认消息?
【问题讨论】:
您是否尝试使用此标志运行它?
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
【讨论】:
coreutils)。
如果您对包装器感到满意,请尝试类似
mkdir -v "$@" | sed 's/mkdir: created directory /jar-jar: yea, weesa gotta /'
更根本的是,mkdir 中的消息字符串通常或多或少是硬编码的。但是,如果有本地化支持,您实际上可以用自己的方式覆盖消息目录。
例如,如果您的 mkdir 是使用 gettext 构建的,您可以创建一个新的英语 .po 文件,替换目录创建消息,构建一个新的语言环境,然后使用它运行。另见http://translationproject.org/domain/coreutils.html
这取决于你想要什么,这介于严重的矫枉过正和疯狂之间。
【讨论】:
你可以像这样创建一个脚本:
#/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 的输出。
"$@"。
来自the source code for mkdir.c,这是处理-v 选项的部分:
case 'v': /* --verbose */
options.created_directory_format = _("created directory %s");
break;
如您所见,使用的字符串被硬编码到源代码中。要将消息永久更改为自定义消息,可以修改这部分源代码并重新编译mkdir。
【讨论】:
_(...) 表示它不是严格的硬编码。相反,对硬编码的源字符串执行gettext 查找,查找的结果就是实际打印的结果。