쉘 기능은 Linux에서 어디에 저장됩니까?


11

처음 which에는 특정 프로그램을 인수로 제공 한 후 아무것도 출력하지 않는 이유를 찾고있었습니다 ( 예 :) cd.

내가 찾은 바로는 여기 , 그 이유는 아마도 것입니다 cd내 컴퓨터에서 실행하여 확인하는 기능입니다 type cd.

TLDR : 그러나 변수 which덕분에 찾을 수있는 일반적인 프로그램 은 함수 또는 스크립트가 저장된 폴더 $PATH중 하나에 저장됩니까?$PATHcd

user@linuxmchine:~$ type cd
cd is a function
cd () 
{ 
    __zsh_like_cd cd "$@"
}

나는 얻는다 cd is a shell builtin. 쉘 매뉴얼 페이지를 살펴보십시오 (zsh?)
Xen2050

1
unix.stackexchange.com/questions/85249/…를 확인하십시오 . 문제는 특히이 질문과 같은 이유로 사용해서는 안되는 레거시 명령이라는 것입니다.
Joe

답변:


12

사용자 정의 함수

일반적으로 bash 함수는 bash시작 스크립트 에 영구적으로 저장됩니다 .

  • 시스템 전체 시작 스크립트 : /etc/profile로그인 쉘 및 /etc/bashrc대화식 쉘.
  • 사용자 정의 시작 스크립트 : ~/.bash_profile로그인 쉘 및 ~/.bashrc대화식 쉘.
  • 대화식 / 로그인 셸에 대한 자세한 내용 man은 INVOCATION 섹션 의 bash 페이지에서 찾을 수 있습니다 .

사용자 정의 셸 함수는 bash가 시작될 때 해시 (또는 조회 테이블)에 동적으로로드됩니다. bash 소스 파일 variable.c에서 테이블에 대한 정의는 다음과 같습니다.

/* The list of shell functions that the user has created, or that came from
   the environment. */
HASH_TABLE *shell_functions = (HASH_TABLE *)NULL;

bash declare명령 으로 사용자 정의 함수를 나열 할 수 있으며 다른 쉘은 여전히을 사용 typeset합니다. bash declare에서 typeset명령 을 대체했습니다 .

declare -f

이 함수는 bash 쉘의 수명 동안 메모리에 존재합니다.

쉘 정의 (내장) 함수

이 같은 일반적인 기능이다 echo, printf, cd:. 그것들은 bash실행 파일에 연결된 라이브러리로 컴파일됩니다 . 실행 파일에 정의를 작성하면 외부 정의를로드하는 것과 비교하여 시간이 절약됩니다. 이러한 함수에 대한 정의 ( .defC 소스로 구문 분석 된 소스 파일에 보유)는 builtinsbash 소스 디렉토리에 보관됩니다 .

유용한 기능 : 쉘 내장 명령 사용에 대한 정보 help <command>. 예 :

help                # list all builtins
help declare        # info and options for declare
help -m declare     # gives man style information for declare

그 발췌 한 답변에 감사드립니다. 이것이 바로 내가 찾던 것입니다. bash 함수 작성 프로세스를 따르는 도구 또는 함수 typeset의 작성 / 변경을 유발 한 파일 / 스크립트를 보여주는 도구가 있다고 생각하십니까 ?
Gabrijel Šimunović

나는 그러한 도구를 모른다.- declare또는 typeset함수 정의의 소스 파일을 표시하는 명령에 유용한 옵션이 될 것이다 . 소프트웨어 엔지니어링 문제라고 생각합니다. 최근에 .alias파일에 정의 된 쉘 함수가 발견되었습니다 .
suspectus

8

기능 은 쉘 의 메모리 (또는 문서화되지 않은 임시 파일)에 저장됩니다. 그들은 쉘이 시작될 때까지 사용할 수있는 방법이 존재하지 않는다 (예를 들어, 당신은 CLI에 로그인하거나 같은 쉘 창을 시작할 때 xterm)하고 정의 (예를 들어, 읽어있다 .bashrc, .bash_profile또는 비슷한) 그들이에 중단 쉘이 종료 될 때 존재합니다.


1
프롬프트에서 입력하는 임시 속성이 중요합니다. 나의 투표는이 답변에 간다. cd () { pwd; builtin cd "$@"; }프롬프트에 입력하면 저장된 유일한 위치는 현재 실행중인 쉘의 메모리에 있습니다. (나의 예는 Bash이지만 동일한 원칙이 모든 쉘에 적용됩니다.)
tripleee

6

cd및 기타 일반적인 명령은 좋아 echo, typealias소위되어 내장 명령을 .

내장 명령은 쉘 자체에 포함되며 다른 쉘은 다른 내장 명령을 가질 수 있습니다.


4
내장 명령에 대한 실행 코드 cd가 쉘 프로그램 자체에 포함되어 /bin/bash있는지 , 예를 들어 파일 이 쉘인 경우 파일 내에 포함되어 있는지 강조 할 가치가 있는지는 모르겠습니다 . (여기서 당신의 말은 분명하다고 생각하지만 사람들이 모든 종류의 것들에 혼란스러워하는 것을 보았습니다.)
David Z

1

수퍼 유저 질문 bash 함수의 정의를 찾는 것은 이것과 밀접한 관련이 있습니다. User HairOfTheDog다음과 같은 답변을 제공 했습니다 .

다음 명령은 함수 정의의 위치 (파일 이름 및 줄 번호)를보고합니다. 라는 함수를 가정하면 foo,

# Turn on extended shell debugging
shopt -s extdebug

# Display the function’s name, line number and fully qualified source file
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

예를 들어, 이러한 명령의 출력은 다음과 같습니다.

foo 32 /source/private/main/developer/cue.pub.sh

위의 내용은 bashPOSIX 셸이 아닌 에서만 작동 할 수 있습니다 .

이것을 찾는 Blue Raspberry 에게 감사드립니다 !

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.