Linux 명령 탈출

Linux 명령 탈출

기본적으로 파일의 문자열을 대체하는 내가 작성한 스크립트에서 명령을 실행하려고 합니다.

vzctl exec VZID sed -i 's/\/>/address="$IP\/255.255.255.0"\/\>/' "file.xml"

문제는 명령이 누락되어 있다는 것입니다 '."

'및를 유지하라는 명령을 피할 수 있는 방법이 있습니까 "? 아니면 어떤 식으로든 캡슐화하나요?

답변1

아마도 이것은 vzctl exec다음과 같습니다 eval.껍데기명령줄은 받은 인수를 연결하여 생성됩니다. 따라서 유효한 쉘 명령줄을 인수로 전달해야 합니다. 이는 또 다른 수준의 인용을 의미합니다.

vzctl exec VZID '
  sed -i '\''s/\/>/address="$IP\/255.255.255.0"\/\>/'\'' "file.xml"'

$IP참고 하시기 바랍니다아니요확대됩니다. 이렇게 하려면 다음이 필요합니다.

vzctl exec VZID '
  sed -i '\''s/\/>/address="'"$IP"'\/255.255.255.0"\/\>/'\'' "file.xml"'

명령을 해석하는 쉘을 통해 명령을 확장하려면 다음을 수행 vzctl하십시오.

vzctl exec VZID '
  sed -i '\''s/\/>/address="'\''"$IP"'\''\/255.255.255.0"\/\>/'\'' "file.xml"'

호출 셸에 의해 확장됩니다 vzctl exec(셸이 해당 $IP변수에 액세스할 수 있다고 가정).

명확성을 위해 여기에 있는 문서를 사용하고 코드를 변수에 저장하는 것이 더 쉬울 수 있습니다. 예를 들면 다음과 같습니다.

code=$(cat <<EOF
sed -i 's|/>|address="$IP/255.255.255.0"/>|' file.xml
EOF
)

(여기서 이 문서 형식은 변수를 확장합니다(여기 $ID)).

다음과 같이 실행하십시오.

vzctl exec VZID "$code"

답변2

전체 명령을 따옴표로 묶고 백슬래시로 내부를 구분해 보셨나요?

내 말은:

vzctl exec VZID 'sed -i \'s/\/>/address=\"$IP\/255.255.255.0\"\/\>/\' \"file.xml\"'

작은 따옴표가 작동하지 않으면 큰 따옴표도 확인하겠지만 그렇게 해야 한다고 생각합니다.

관련 정보