위에서 정의했지만 스크립트에서 별칭을 사용할 수 없습니다!

위에서 정의했지만 스크립트에서 별칭을 사용할 수 없습니다!

매우 이상한 상황이 발생했습니다.../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'

запретить

관련 정보