【问题标题】:What is the verbose option in mkdir?mkdir 中的详细选项是什么?
【发布时间】:2015-04-12 18:54:26
【问题描述】:

我正在阅读Shell (Bash) Scripting 的入门知识,并注意到mkdir 的联机帮助页描述了一个详细选项,该选项会在创建目录时显示一条消息:

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

似乎mkdir -v 打印了一条预定义的消息。有没有办法打印自定义消息?有没有办法永久设置自定义消息而不是默认消息?

【问题讨论】:

    标签: linux bash shell sh mkdir


    【解决方案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

    【讨论】:

    【解决方案2】:

    如果您对包装器感到满意,请尝试类似

    mkdir -v "$@" | sed 's/mkdir: created directory /jar-jar: yea, weesa gotta /'
    

    更根本的是,mkdir 中的消息字符串通常或多或少是硬编码的。但是,如果有本地化支持,您实际上可以用自己的方式覆盖消息目录。

    例如,如果您的 mkdir 是使用 gettext 构建的,您可以创建一个新的英语 .po 文件,替换目录创建消息,构建一个新的语言环境,然后使用它运行。另见http://translationproject.org/domain/coreutils.html

    这取决于你想要什么,这介于严重的矫枉过正和疯狂之间。

    【讨论】:

      【解决方案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 :我在我的 Mac 上进行了测试,mkdir 将消息输出到标准输出。我没有在 Linux 上测试。 OP 要求使用 Linux,所以我不好。
      • 另外,你应该总是双引号"$@"
      • @tripleee:我刚刚在 CentOS 6.3 上进行了测试。详细消息来自标准输出。你在什么 Linux 上测试?
      • 对不起,你是对的,我一定是第一次打错了。
      【解决方案4】:

      来自the source code for mkdir.c,这是处理-v 选项的部分:

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

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

      【讨论】:

      • _(...) 表示它不是严格的硬编码。相反,对硬编码的源字符串执行gettext 查找,查找的结果就是实际打印的结果。
      猜你喜欢
      • 2015-04-04
      • 1970-01-01
      • 2020-04-18
      • 2020-12-29
      • 1970-01-01
      • 2011-11-28
      • 2019-12-07
      • 1970-01-01
      • 2015-09-17
      相关资源
      最近更新 更多