다음 코드를 고려해 보겠습니다.
#!/bin/bash
var=$(
cat <<-EOF
Foo Bar
EOF
)
echo "${var}"
이는 탭에서 예상대로 작동합니다. 즉, var
변수가 할당된 상태로 유지됩니다.Foo Bar
그러나 터미널에서 이 파일을 삭제하고 cp
또는 대신 이 스크립트의 내용을 다른 파일에 복사하여 붙여넣는 상황을 고려하십시오.scp
이제 스크립트에는 탭 대신 공백이 포함되므로 위의 동일한 스크립트는 탭 대신 공백으로 인해 오류가 발생합니다.
unexpand
그래서 프로그램을 진행하기 전에 스크립트를 수정 하고 싶습니다.
위의 코드를 이렇게 수정해 보았습니다.
#!/bin/bash
unexpand --first-only $0 | sponge $0
var=$(
cat <<-EOF
Foo Bar
EOF
)
echo "${var}"
이것은 두 번째로 효과가 있었고 왜 이런 일이 발생하는지 알고 있습니다.
하지만 이 프로그램이 처음에 올바르게 실행되기를 원합니다. 탭 대신 공백을 사용하여 처음에 올바르게 실행되도록 스크립트를 수정하려면 어떻게 해야 합니까?
참고: 파일을 두 개의 별도 스크립트로 분할하면 이 작업을 수행할 수 있다는 것을 알고 있지만 그렇게 하고 싶지는 않습니다. 나는 단지 하나의 스크립트만을 갖고 싶습니다.
답변1
실행 중인 스크립트의 소스 코드를 수정하려는 것은 코악마의 길인 것 같습니다.
(테스트되지 않음)은 어떻습니까?
#!/usr/bin/env bash
: ${TMPDIR='/usr/tmp'}
tmpfile=$(mktemp)
tooldir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
if [[ "$tooldir" != "$TMPDIR" ]]; then
# copying first to get the same permissions on the tmp as on the original
cp "$0" "$tmpfile" &&
unexpand --first-only "$0" > "$tmpfile" &&
"$tmpfile" "$@"
fi
var=$(
cat <<-EOF
Foo Bar
EOF
)
echo "${var}"