我是尝试编写 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。