별칭을 가져오지 못했습니다. 해당 파일이나 디렉터리가 없습니다.

별칭을 가져오지 못했습니다. 해당 파일이나 디렉터리가 없습니다.

깊은 디렉토리 트리에 다양한 버전의 쉘 스크립트가 있습니다. 이를 단순화하기 위해 별칭을 생성하는 기능을 추가했습니다(명령줄 옵션을 통해 선택).

function make_alias {
    local CMD NAME
    NAME=$( basename ${BASH_SOURCE[0]} )
    CMD=$( realpath ${BASH_SOURCE[0]} )
    echo "alias $NAME=\"$CMD\""
    exit 0
}

실행하면 stdout에 유효한 별칭 명령이 생성됩니다.

$ ./myscript -a
alias myscript="/home/symcbean/library/tools/webserver/myscript"

잘라서 붙여넣으면 작동합니다.

그러나 현재 셸에서 출력을 얻으려고 하면 오류가 발생합니다.

$ source $(./myscript -a)
-bash: alias: No such file or directory

내가 무엇을 놓치고 있나요?

(Ubuntu 22.04에서 bash 5.1.16 사용)

답변1

source $(./myscript -a)

그건 작동하지 않습니다. source다른 쉘 스크립트 파일의 소스 코드를 읽고 이를 현재 쉘에서 실행하는 것을 의미합니다. 그렇게 할 수 eval $(./myscript -a)는 있지만 음, 별칭에 대한 정말 어색한 사용 사례입니다.

솔직히 저는 /var/run 아래 디렉토리에 스크립트에 대한 심볼릭 링크를 넣고 경로에 추가했습니다(아직 경로의 일부가 아닌 경우).

function make_alias {
  local executable
  local binpath

  executable=$0
  binpath="/var/run/${UID}/shortcuts"

  mkdir -p "${binpath}"
  # next 3 lines adapted from https://superuser.com/a/39995/563936
  if [[ ":$PATH:" != *":${binpath}:"* ]]; then
    PATH="${PATH:+"$PATH:"}${binpath}"
  fi

  # Place symlink in /var/run sudirectory
  ln -s "$(realpath "${executable}")" "${binpath}/$(basename "${executable}")"
}

개인적으로 나는 이것이 수많은 별칭으로 쉘을 복잡하게 만드는 것보다 훨씬 더 우아하다고 생각합니다. 선택 항목에 배치하여 $PATH우선 순위를 정의할 수 있습니다. 즉 중요한 시스템 명령이 실수로 숨겨지지 않고 type여전히 which눌러져 있습니다. 예상대로 작동하며 가져오기 쉽습니다. (해당 디렉토리를 확인하여) 생성한 바로가기에 대한 개요 및 바로가기는 각 셸에서 설정하지 않고 여러 셸 간에 전송됩니다(두 셸 모두에 존재하는 한 $binpath)$PATH ...

관련 정보