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
sh
나는 이식성을 원하기 때문에 , not bash
또는 다른 것에 대한 솔루션을 원합니다 .. 또한 코드를 더 짧게 만드는 방법 등에 대한 팁을 제공하지 마세요. 저는 단지 위의 문제에 대한 해결책을 원할 뿐입니다.
답변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
항상 해석되고 \
s가 손실되는 문제를 겪습니다. 데이터 문자열을 다시 인쇄할 때 데이터 문자열을 이스케이프할 수 있는 방법이 필요합니다.
echo
다음은 s 관련 문제를 피하기 위해 여러 호출을 사용하는 개선 사항입니다 \n
.
#!/bin/sh
data='echo "#!/bin/sh"\necho "data=$data"\necho -e "$data"'
echo "#!/bin/sh"
echo "data='$data'"
echo -e "$data"
극복하기 어려운 작은 결함이 하나 있습니다. '
출력(가운데 echo
)에 s가 누락되어 있습니다.
#!/bin/sh
data='echo "#!/bin/sh"\necho "data=$data"\necho -e "$data"'
echo "#!/bin/sh"
echo "data=$data"
echo -e "$data"
그게 내가 당신을 위해 가진 전부입니다. 이스케이프 문제의 일부 시작점. 행운을 빌어요!