현재 bash 환경에 파일 소스 자체를 포함하기 위해 shebang을 사용할 수 있습니까?

현재 bash 환경에 파일 소스 자체를 포함하기 위해 shebang을 사용할 수 있습니까?

점점 더 많은 컬렉션을 보유하고 있습니다.스크립트어느실행하면 안 되고 소싱해야 합니다.. 지금 그들은 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에서 작동합니다. 일부 다른 OS에서는 첫 번째 공백을 제외한 모든 공백을 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() { ...; }

관련 정보