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.

관련 정보