tr 不在函数内部工作

tr 不在函数内部工作

我是尝试编写 bash 函数的新手,所以也许我做错了什么,但是当我执行时:

myfile=test.txt
cat $myfile 2>&1 | tee "cat_$(echo "$myfile" | tr . _)_$(date +%Y_%m_%d_%H%M%S).txt"

它保存一个以以下开头的文件cat_test_txt_

但是当我将此函数保存在我的.bashrc

catfile () {
  cat $1 2>&1 | tee "cat_$(echo "$1" | tr . _)_$(date +%Y_%m_%d_%H%M%S).txt";
}

然后执行:

catfile test.txt

它保存一个以cat_test.txt_

有谁知道为什么是“。”不是被“_”取代了吗?

答案1

我不知道,也无法重现。

您可以typeset -f catfile检查您的函数是否按照您的想法定义,或者运行(set -o xtrace; catfile test.txt)以查看它实际上在做什么。

但是在这里,如果使用bash,我宁愿这样写:

catfile () {
  local file
  printf -v file 'cat_%s_%(%Y_%m_%d_%H%M%S)T.txt' "${1//./_}" -1
  <"$1" tee -- "$file"
}

使用 的bash内置函数printf进行格式化和时间戳扩展以及 ksh93 样式${param//pattern/replacement} 参数扩展运算符进行.->_替换。

或者zsh等效的:

catfile() <$1 >&1 > cat_${1//./_}_${(%):-%D{%Y_%m_%d_%Y%M%S}}.txt

当输出被重定向多次并提示扩展(此处使用参数扩展标志在参数扩展时启用)时,此处使用zsh的内部来生成时间戳。tee%

您的方法存在一些(不相关的)问题:

  • 您正在使用的echo不能用于任意数据
  • 你忘记了周围的引号$1
  • --之前忘记了$1分隔选项
  • UUOC。

相关内容