지연된 확장

지연된 확장

저는 quine .sh 스크립트를 만들고 싶습니다. 이것이 제가 지금까지 한 일입니다
quine.sh. ::

#!/bin/sh
q="#!/bin/sh\nq=$q;echo \$q";echo $q

이 줄에 집중하세요:

q="#!/bin/sh\nq=$q;echo \$q";echo $q

$q(in ) \nq=$q이 처음 발생 하면 먼저 변수의 나머지 부분을 설정한 다음 이 부분( setlocal enabledelayedexpansion배치 파일의 한 줄)을 설정하려고 합니다.shbash나는 이식성을 원하기 때문에 , not 또는 다른 것에 대한 솔루션을 원합니다.. 또한 코드를 더 짧게 만드는 방법 등에 대한 팁을 제공하지 마십시오. 위의 문제에 대한 해결책을 원합니다.

답변1

'초기 문자열을 s 대신 "s 로 감싸면 $q즉시 확장되지 않습니다. 그런 다음 나중에 다음을 사용하여 확장할 수 있습니다 eval.

#!/bin/sh
q='#!/bin/sh\nq=$q;eval "echo \"\$q\""';eval "echo \"$q\""

불행하게도 \n확장이 없으면 's와 "s는 손실되고 \"s는 "s가 됩니다.

산출:

#!/bin/sh\nq=#!/bin/sh\nq=$q;eval "echo \"\$q\"";eval echo "$q"

우리는 꽤 친했지만 탈출 문제를 해결하려는 노력은 sed결국 꽤 번거로웠습니다.


jw013의 링크는 상당히 이해하기 쉬운 접근 방식을 권장합니다.

  • 1부: 프로그램의 두 번째 부분을 포함하는 일부 데이터(변수 등) 정의
  • 파트 2: 데이터를 사용하여 프로그램의 첫 번째 부분을 출력한 다음 데이터를 사용하여 프로그램의 두 번째 부분을 출력합니다. (1부에서 요구되는 래핑 및 이스케이프 처리는 여기에서 처리됩니다.)

대략적인 첫 번째 시도는 다음과 같습니다.

#!/bin/sh
data="echo -e \"#!/bin/sh\ndata=\"\$data\"\"\\n\$data"
echo -e "#!/bin/sh\ndata=\"$data\"\n$data"

산출:

#!/bin/sh
data="echo -e "#!/bin/sh
data="$data""
$data"
echo -e "#!/bin/sh
data="$data""
$data

이 시도는 \n항상 해석되고 누락되는 \문제가 있습니다 . 데이터 문자열을 다시 인쇄할 때 이를 이스케이프할 방법이 필요합니다.


echo이는 s 관련 문제를 피하기 위해 여러 호출을 사용하는 개선 사항입니다 \n.

#!/bin/sh
data='echo "#!/bin/sh"\necho "data=$data"\necho -e "$data"'
echo "#!/bin/sh"
echo "data='$data'"
echo -e "$data"

극복하기 어려운 작은 결함이 있는데, 출력에 's(middle)가 부족하다는 것입니다.echo

#!/bin/sh
data='echo "#!/bin/sh"\necho "data=$data"\necho -e "$data"'
echo "#!/bin/sh"
echo "data=$data"
echo -e "$data"

이것이 내가 당신을 위해 가진 전부입니다. 문제 탈출을 위한 몇 가지 출발점. 행운을 빌어요!

관련 정보