Shebang을 사용하여 파일 소스 자체를 현재 bash 환경에 넣을 수 있나요?

Shebang을 사용하여 파일 소스 자체를 현재 bash 환경에 넣을 수 있나요?

내 컬렉션이 늘어나고 있어요스크립트어느실행하지 말고 받아야 함. 이제 그들은 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() { ... }

관련 정보