점점 더 많은 컬렉션을 보유하고 있습니다.스크립트어느실행하면 안 되고 소싱해야 합니다.. 지금 그들은 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() { ...; }