저는 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
bash
나는 이식성을 원하기 때문에 , 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"
이것이 내가 당신을 위해 가진 전부입니다. 문제 탈출을 위한 몇 가지 출발점. 행운을 빌어요!