바로 위에서 정의하더라도 스크립트에서 별칭을 사용할 수 없습니다!

바로 위에서 정의하더라도 스크립트에서 별칭을 사용할 수 없습니다!

매우 이상한 경우가 있습니다... /bin/bash를 사용하여 스크립트를 실행하면 스크립트 내부에서도 설정한 별칭을 인식할 수 없습니다. 그리고 가장 이상한 점은

$ cat -n test.sh
    1 #!/bin/bash
    2 alias somecommand='ls -alF'
    3 alias
    4 somecommand
$ ./test.sh
alias somecommand='ls -alF'
./test.sh: line 4: somecommand: command not found

... 위에 표시된 대로 스크립트에서 "alias" 명령을 실행하면 bash가어떤 명령별칭에 추가하지만, 내가 실행하면어떤 명령그 자체로는 여전히 인식되지 않습니다!

스크립트를 실행하기 위해 "sh" 명령을 사용하면 모든 것이 옳습니다. 그러면 bash의 버그입니까? 아니면 내가 놓친 것이 있습니까?

도움을 주시면 감사하겠습니다!

답변1

단순히하지 마십시오사용스크립트의 별칭. 스크립트에서 대화형으로 사용하도록 설계된 기능을 사용하는 것은 의미가 없습니다. 대신 다음 함수를 사용하세요.

somecommand () {
    ls -alF
}

함수는 별칭보다 훨씬 더 유연합니다. 다음은 별칭과 거의 비슷하게 ls항상 수행되는 버전 ls -F(사용하는 플래그를 포함하여 인수가 전달됨 )으로 평소 버전을 오버로드합니다 .$@alias ls="ls -F"

ls () {
    command ls -F "$@"
}

여기서는 command쉘이 무한 재귀로 들어가는 것을 방지합니다. 그렇지 않으면 함수가 호출되기 때문에 그렇게 됩니다 ls.

별칭은 다음과 같은 작업을 수행할 수 없습니다.

select_edit () (
    dir=${1:-.}
    if [ ! -d "$dir" ]; then
        echo 'Not a directory' >&2
        return 1
    fi
    shopt -s dotglob nullglob
    set --
    for name in "$dir"/*; do
        [ -f "$name" ] && set -- "$@" "$name"
    done
    select file in "$@"; do
        "${EDITOR:-vi}" "$file"
        break
    done
)

select_edit이는 디렉터리를 인수로 사용하고 사용자에게 해당 디렉터리에서 파일을 선택하도록 요청하는 함수를 생성합니다 . 선택한 파일은 편집을 위해 편집기에서 열립니다.

설명서 bash에는 다음과 같은 내용이 포함되어 있습니다.

거의 모든 목적에서 별칭은 셸 함수로 대체됩니다.

답변2

Bash 스크립트 내에서 별칭과 같은 대화형 기능을 사용하려면 대화형 Bash 셸에서 실행해야 합니다. 이를 변경하려면 첫 번째 줄에 -i. 따라서 새 스크립트 파일은 다음과 같습니다.

#!/bin/bash -i
alias somecommand='ls -alF'
alias
somecommand 

답변3

일종의 중복이전 질문그러나 거기에 대한 대답은 다소 장황합니다. 짧은 대답은 신비한 이유로 기본적으로 bash는 스크립트 내부에 정의된 별칭을 보지 않는다는 것입니다. shopt -s expand_aliases해당 스크립트 상단에 있는 줄을 통해 명시적으로 지시해야 합니다 . 그렇게 하면 스크립트가 다음을 찾을 것입니다.어떤 명령.

답변4

shopt -sq expand_aliases예를 들어 UTF-8 인코딩에서 다음 코드를 사용하세요 .

#!/bin/bash

function запрещать() {
    if [ $1 -eq 3 ]
    then
        echo -n "Запрещено. Код ошибки: "
        echo `expr 2 \* 3 \* 47`
    else
        echo -n "."
        запрещать `expr $1 + 1`
    fi
}

#function запретить() {
#   запрещать 1
#}

shopt -sq expand_aliases
alias запретить='запрещать 1'

запретить

관련 정보