명령을 파일에 저장하고 다른 파일에서 읽으려고 합니다. 명령은 파이프 없이도 잘 작동하지만 명령에 파이프가 있는 한 실행되지 않습니다.
누구든지 나를 도와줄 수 있나요?
스크립트
#!/bin/bash
rm -f /ZLD_Implement/ZLD_Implement.txt
while IFS=#, read -r Command_info1 Command; do
variable1=$Commandenter code here
echo "$Command_info1" >> /ZLD_Implement/ZLD_Implement.txt
echo "`$variable1`" >> /ZLD_Implement/ZLD_Implement.txt
done < /ZLD_Implement/ZLD_Command_list.txt
명령 목록:
[root@localhost ZLD_Implement]# cat ZLD_Command_list.txt
Command to check the hostname # hostname
Command to check the linux kernel version # uname -a
Command to check the current system date # dateer code here
Command to check Disk space # df -kh
Command to cheeck routes in Netstat # netstat -nrv
command to check audit logs # ausearch -i -m USER_CHAUTHTOK,USER_MGMT,USER_AUTH` -if /var/log/audit/audit.log|tail -50nter code here
답변1
쉘은 변수를 확장하기 전에 파이프를 구문 분석(및 리디렉션, 인용 및 이스케이프 등)하므로 파이프(또는 리디렉션 또는...)를 변수에 넣으면 확장될 때 이미 너무 늦습니다. 정상적으로 실행되면 명령에 대한 일반적인 인수일 뿐입니다. 바라보다BashFAQ #50: 명령을 변수에 넣으려고 하는데 복잡한 경우에는 항상 실패합니다!
해결책: 이 경우에는 위험한 방법으로 남용되기 쉽기 때문에 버그 자석이라는 평판이 좋지 않습니다 eval
. eval
기본적으로 그 목적은 셸 구문 및 명령과 같은 데이터를 실행하는 것입니다. 이는 실행 가능한 코드와 게으른 데이터(예: 파일 이름) 사이의 경계가 평소보다 약하다는 것을 의미합니다. 하지만 이 경우 ZLD_Command_list.txt에서 읽은 데이터는 다음과 같습니다.해야한다쉘 구문 및 명령으로 처리됩니다. rm -R /
파일에 하나가 있으면 다음과 같습니다 .~해야 한다전체 파일 시스템을 삭제합니다.
그러나 여전히 올바른 인용을 준수해야 합니다. 이는 변수에 큰따옴표를 의미합니다(예 : 역따옴표 대신 eval "$variable1"
사용 eval $variable1
하는 것이 좋습니다).$()
배쉬 FAQ #82echo
), 하지만 결과 만 원하므로 명령을 실행하면 안 되는 이유는 무엇입니까?
$Command
다른 가능한 최적화: 값을 에 복사하지 말고 $variable1
직접 사용하십시오. 각 명령의 출력을 개별적으로 리디렉션하는 대신 전체 루프의 출력을 리디렉션하지 않는 이유는 무엇입니까?
위의 모든 사항이 수정된 내 버전은 다음과 같습니다.
#!/bin/bash
while IFS=#, read -r Command_info1 Command; do
echo "$Command_info1"
eval "$Command"
done < /ZLD_Implement/ZLD_Command_list.txt > /ZLD_Implement/ZLD_Implement.txt
아, 표준 출력뿐만 아니라 명령의 오류 출력도 캡처하고 싶습니까? 그렇다면 2>&1
최종 리디렉션 후에 추가하세요.