저는 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.