나는 이것을 시도했습니다 :
echo " mv /server/today/logfile1 /nfs/logs/ && gzip /nfs/logs/logfile1" | sed 's|logfile1|logfile2|g'
다음과 같이 인쇄됩니다.
mv /server/today/logfile2 /nfs/logs/ && gzip /nfs/logs/logfile2
이것은 배시 명령입니다. 그냥 인쇄하는 대신 어떻게 실행되도록 할 수 있나요?
답변1
명령을 셸에 파이프하여 실행할 수 있습니다.
echo "mv ..." | bash
또는 이를 쉘에 인수로 전달할 수 있습니다.
bash -c "$(echo "mv ...")"
또는 내장된 bash를 사용할 수도 있습니다 eval
.
eval "$(echo "mv ...")"
그러나 이러한 모든 코드 생성 명령은 나에게 약간 취약해 보입니다(일부 경로에 공백이 포함되는 즉시 실패함).
답변2
기록 교체를 다시 구현하고 있습니다.
$ mv /server/today/logfile1 /nfs/logs/ && gzip /nfs/logs/logfile1
$ !!:gs/logfile1/logfile2
아직 첫 번째 명령을 실제로 실행하지 않았지만 유사한 명령 세트를 실행하려는 경우 루프 사용을 고려하십시오.
for f in logfile logfile2; do
mv /server/today/"$f" /nfs/logs && gzip /nfs/logs/"$f"
done
답변3
이 작업은 다음을 통해 수행할 수도 있습니다 xargs
.
echo "mv ..." | sed "..." | xargs command
예:
$ echo "whoareyou" | sed "s/areyou/ami/g" | xargs command
username
- 그렇다면
&&
다음이 필요합니다eval
.
$ echo "whoareyou && whoareyou" | sed "s/areyou/ami/g" | xargs command eval
username
username
실행된 명령을 인쇄할 수도 있습니다.
xargs -t
$ echo "whoareyou && whoareyou" | sed "s/areyou/ami/g" | xargs -t command eval
command eval whoami '&&' whoami
username
username
tee
echo "whoareyou && whoareyou" | sed "s/areyou/ami/g" | tee >(sh)
whoami && whoami
username
username