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"
}

書式設定とタイムスタンプの拡張と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。

おすすめ記事