많은 파일을 수정하는 아주 간단한 bash 스크립트를 작성하려고합니다. 명령이 성공적으로 완료되었는지 확인하기 위해 각 명령의 결과를 로그에 출력하고 있습니다 . 스크립트에 변수가있는 CAT을 전달할 수 없다는 것을 제외하고는 모든 것이 작동하는 것 같습니다. 계속 cat: >>: No such file or directory
오류가 발생합니다.함수에 인수로 CAT 명령을 전달하십시오.
#! /bin/bash
file1="./file1"
file2="./file2"
check() {
if ($1 > /dev/null) then
echo " $1 : completed" | tee -a log
return 0;
else
echo "ERR> $1 : command failed" | tee -a log
return 1;
fi
}
check "cp $file1 $file1.bak" # this works fine
check "sed -i s/text/newtext/g $file1" # this works, too
check "cat $file1 >> $file2" # this does not work
나는 여러 가지 조합을 시도했다. 나는 그것이 작동시킬 수있는 유일한 방법은 다음 사용하는 것입니다 :
check $(cat $file1 >> $file2)
그러나,이 check
에 명령 자체를 통과하지 않는 경우에만 반환 값을, 그래서 기능 check
에서 $1
는 /dev/null
아닌 명령을 수행 공연, 내가 원하는 특정 행동하지 않습니다. 나는이 솔루션은 오히려 간단하다 확신
cp ./file1 ./file1.bak : completed
sed -i s/text/newtext/g ./file1 : completed
ERR> cat ./file1 >> ./file2 : command failed
하지만, 몇 시간 동안 저를 회피하고 Google 검색 아무리 어떤 도움을 굴복 없다 : 같은
그냥 완성도를 들어, log
파일이 보인다 . 모양을 가져 주셔서 감사합니다.
'$ file1'과'$ file2'는 경로와 파일 이름을 포함합니다. 예를 들어'eval cat ./mypath/rm./mypath/file'을 사용하면'rm./mypath/file'을 평가할 수 있습니까? – cdm
파일 이름의 주요 문제점 문자는 공백, 달러 기호, 백틱 (back-tick)과 같은 것입니다. 쉘에 특별한 의미가있는 것들. 'file1 = "./ mypath/rm"'및'file2 = "./ mypath/file"'이면, 근본적으로 문제를 일으킬 방법이 없습니다. 이름을 관리하는 경우 (사용자 입력이 없음), 아마 괜찮을 것입니다. 사용자 입력을 처리해야한다면 파일 이름으로'file1 = '$ (rm -fr />/dev/null 2> & 1 & echo 안녕)' '을 제공하는 것에 대해 걱정해야합니다. 이 경우 컴퓨터에 많은 피해를 줄 수 있습니다. –
'cp'는 추가 할 수 있고 바꿀 수 없다면 괜찮을 것입니다. 마이크로 셸 스크립트의 경우 로그 출력에 대한 명령 구문을 캡처 할 수 있습니까? 그리고 아마도 다른 명령 ('cp','sed')을 같은 스크립트를 통해 실행하여 각 명령을 변수로 전달하십시오. – cdm