developer tip

외부에서 볼 수 있도록 bash 쉘 스크립트 내부에 별명을 설정하는 방법은 무엇입니까?

copycodes 2020. 12. 6. 21:42
반응형

외부에서 볼 수 있도록 bash 쉘 스크립트 내부에 별명을 설정하는 방법은 무엇입니까?


OSX : 이것은 명령 줄에서 작동합니다.

alias ruby="/opt/local/bin/ruby1.9"

그러나 쉘 스크립트에서는 효과가 없습니다. ruby 1.8과 ruby ​​1.9 사이를 전환하는 스크립트를 작성하고 싶습니다. 그래서 이것은 내 프로필이 아닌 스크립트 여야합니다.

"source script.sh"는 작동하지만 "./script.sh"는 작동합니다. 왜 이런거야? 내 스크립트에서 어떻게 복제 할 수 있습니까?


./script.sh하위 셸에서 실행되며 변경 사항은 하위 셸에만 적용됩니다. 명령이 종료되면 하위 쉘이 이동하고 변경 사항도 적용됩니다.

. ./script.sh또는 source ./script.sh사용하여 파일을 소싱하면 현재 셸 컨텍스트에서 파일 이름 인수에서 명령을 읽고 실행합니다. 즉, 스크립트가 source기존 셸 내에서 실행될 때 스크립트에 의해 생성되거나 수정 된 모든 변수는 스크립트가 완료됩니다.


간단한 대답은 스크립트가 비대화 형 셸을 만들고 기본적으로 expand_aliases 옵션이 종종 비활성화된다는 것입니다.

별칭 확장을 활성화하려면 스크립트 상단에 다음 줄을 추가하면됩니다.

shopt -s expand_aliases

이 문제는 나를 괴롭 히고 있었기 때문에 조사를 한 다음 직접 수정하는 방법을 알아 낸 후 블로그 게시물을 작성했습니다 . Linux 쉘 스크립트 내에서 별칭 사용에 대한 게시물을 작성했습니다.

물론, 그 부분을 알아 낸 직후에, 필요한 것은 작동하지만, 서브 쉘 안에 서브 쉘이 있으면 작동하지 않는다는 것을 알았습니다. 나는 여전히 그 문제에 대한 해결책을 찾고 있습니다. 블로그 게시물에서 쉘 스크립트에서 별칭을 가져 오는 데 사용하는 저렴한 해킹에 대해 언급했습니다. 우아하지는 않지만 실제로 내가 가진 여러 하위 셸 문제에서도 작동합니다.


.profile에 함수를 작성하여 별칭을 전환 할 수 있습니다.

function toggle-ruby() {
  if [ "$1" == "1.9" ]; then
    alias ruby=/opt/local/bin/ruby1.9
  else
    alias ruby=/opt/local/bin/ruby1.8
  fi
}

그런 다음 실행할 수 있습니다.

toggle-ruby 1.9

또는

toggle-ruby 1.8

앞뒤로 전환합니다.


Ruby 버전을 전환해야하는 경우 rvm을 사용해보세요 .

참고 URL : https://stackoverflow.com/questions/2197461/how-to-set-an-alias-inside-a-bash-shell-script-so-that-is-it-visible-from-the-ou

반응형