여기에서 문서를 처리하려면 실행하기 전에 스크립트를 확장하세요.

여기에서 문서를 처리하려면 실행하기 전에 스크립트를 확장하세요.

다음 코드를 고려해 보겠습니다.

#!/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}"

관련 정보