私は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"
}
書式設定とタイムスタンプの拡張とksh93スタイルで使用されるbash
組み込み関数printf
${param//pattern/replacement}
パラメータ拡張演算子進行 - .
>_
交換。
またはzsh
均等に:
catfile() <$1 >&1 > cat_${1//./_}_${(%):-%D{%Y_%m_%d_%Y%M%S}}.txt
zsh
出力が複数回リダイレクトされ、拡張を求めるときにタイムスタンプを生成するためにここで内部的に使用されます(パラメータが拡張されると、ここでパラメータ拡張フラグが有効になります)。tee
%
あなたのアプローチにはいくつかの(関連していない)問題があります。
- 使用中のものは
echo
任意のデータと併用できません - 周囲の引用を忘れました
$1
。 - 以前は区切り文字オプションを
--
忘れていました。$1
- UUOC。