![Shebang을 사용하여 파일 소스 자체를 현재 bash 환경에 넣을 수 있나요?](https://linux55.com/image/89150/Shebang%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%8C%8C%EC%9D%BC%20%EC%86%8C%EC%8A%A4%20%EC%9E%90%EC%B2%B4%EB%A5%BC%20%ED%98%84%EC%9E%AC%20bash%20%ED%99%98%EA%B2%BD%EC%97%90%20%EB%84%A3%EC%9D%84%20%EC%88%98%20%EC%9E%88%EB%82%98%EC%9A%94%3F.png)
내 컬렉션이 늘어나고 있어요스크립트어느실행하지 말고 받아야 함. 이제 그들은 shebang을 가지고 있습니다
#! /bin/cat
하지만 나는 내가 했던 것처럼 런타임에 bash에 소스를 제공하는 것을 선호합니다.
$ . /path/to/script.sh
또는
$ source /path/to/script.sh
그러나 bash가 내장되어 .
있으므로 source
그러한 스크립트에 대한 대체 shebang 라인이 가능합니까?
답변1
아니요. Shebang이 등장하면 이미 패배한 것입니다. Shebang은 프로세스 생성 시 적용됩니다 exec()
. 이는 일반적으로 분기 후에 발생하므로 이미 별도의 프로세스에 있습니다. shebang을 읽는 것은 쉘이 아니라 커널입니다.
답변2
명령이 실행되면 she-bang은 쉘이 아닌 커널에 의해 해석됩니다. 그러니 그때는 너무 늦습니다.
다음과 같이 변경할 수 있습니다.
#! /bin/echo Please run (from a Bourne-like shell): .
또는:
#! /bin/sed 2,5!d;s/^#.//
# This script must be sourced from within a shell
# and not executed. For instance with:
#
# . path/to/that/script
rest of the script
사용자에게 무엇을 잘못했는지 알려주세요.
Linux에서 작동해야 합니다. 일부 다른 운영 체제에서는 첫 번째 공백을 제외한 모든 공백을 ASCII가 아닌 공백 문자(예: U+00A0, U+2006...)로 바꿉니다. echo
경로나 유틸리티를 조정해야 할 수도 있습니다 sed
.
답변3
@muru 사용자가 말했듯이 -line 에 도달하면 이미 쉘 세션을 종료했기 때문에 이는 불가능합니다 #!
.
그러나 쉘 파일의 용도에 따라 다른 해결 방법이 있을 수 있습니다.
일부 프로젝트에 사용하는 환경 변수를 설정한 것 같습니다.
그것을 프로젝트라고 부르자 subtool
(왜냐하면 그것은 나의 프로젝트이기 때문이다). 그런 다음 프로젝트의 셸 환경을 설정하는 스크립트를 가질 수 있습니다 project-env
. 예를 들면 다음과 같습니다.
#!/bin/bash
PROJECT="$1"
PROJECT_ROOT="$HOME/projects/$PROJECT"
cd "$PROJECT_ROOT" || exit 1
source "$PROJECT.env"
export PS1="[$PROJECT: \W] \$ "
exec bash -i
달리다:
$ ./project-env subtool
그러면 자동으로 cd
아래 제공된 프로젝트 하위 폴더로 이동하여 $HOME/projects
이 예제에서 호출된 프로젝트 환경 파일 subtool.env
(변수가 초기화되는 위치)을 읽고 프로젝트의 명령줄 프롬프트를 제공하고 대화형 세션에 들어가게 됩니다 bash
.
[subtool: subtool] $
작업이 완료되면 간단히 exit
.
이는 또한 "일반" 로그인 셸 세션 및 기타 프로젝트로부터 프로젝트 환경을 격리하는 이점이 있습니다.
답변4
이러한 .'ed 스크립트에서 수행하려는 작업은 쉘 프로세스를 변경하는 것입니다. 따라서 이를 쉘 프로세스에서 호출해야 합니다. 이는 별칭이나 더 강력한 형제 쉘 기능을 의미합니다. 이는 .profile 또는 동등한 파일에서 일부 설정을 지정해야 함을 의미합니다.
별칭 트릭은 약간 간단합니다: alias mytool1="./my/library/mytool1.sh"
처음부터 다 읽을 수 있나요? . 개요: . /my/library/define_tools.sh
Define_mytools.sh: mytool1() { ... mytool1.sh의 내용... } mytool2() { ... }