태그 보관물: shell-script

shell-script

Bash에서 별칭 지정시기, 스크립트 작성 시점 및 함수 작성시기는? 사람들은 이것을합니다

이 질문을하는 데 거의 10 년의 Linux 사용 시간이 걸렸습니다. 모든 시행 착오와 무작위 심야 인터넷 서핑이었다.

그러나 사람들은 이것을 위해 10 년이 필요하지 않아야합니다. Linux로 시작한 경우 별칭을 언제 지정하고 언제 스크립트를 작성하고 언제 함수를 작성 해야하는지 알고 싶습니다 .

별칭과 관련하여 인수를 사용하지 않는 매우 간단한 작업에 별칭을 사용합니다.

alias houston='cd /home/username/.scripts/'

분명해 보인다. 그러나 어떤 사람들은 이것을합니다 :

alias command="bash bashscriptname"

(그리고 .bashrc파일에 추가 하십시오)

그럴만한 이유가 있습니까? 나는 정말로 열심히 노력하고 있지만, 내가하고 싶은 어떤 상황도 진정으로 생각할 수 없습니다. 따라서 차이가 발생할 수있는 가장 중요한 경우가 있다면 아래에 답변하십시오.

그것이 바로 PATH에 무언가를 넣는 곳이기 때문에 chmod +x수년간의 Linux 시행 착오 후에 나온 또 다른 것입니다.

다음 주제로 넘어갑니다. 예를 들어, .scripts/.bashrc( PATH=$PATH:/home/username/.scripts/) 행을 추가하여 홈 디렉토리 의 숨겨진 폴더 ( )를 PATH에 추가 했기 때문에 자동으로 자동 완성됩니다.

내가 필요한 경우.

그래도 꼭 필요하지는 않습니까? 파이썬과 같이 쉘이 아닌 언어에만 사용합니다.

쉘이라면 매우 동일한 함수를 작성할 수 있습니다 .bashrc.

funcname () {
  somecommand -someARGS "$@"
}

내가 말했듯이 시행 착오를 통해 많은 것을 발견했습니다. 그리고 나는 컴퓨터가 죽었을 때만 기능의 아름다움을 보았고, 주변 사람들이 컴퓨터를 사용하지 않을 때 컴퓨터를 사용해야했습니다.

전체 스크립트 디렉토리를 컴퓨터에서 컴퓨터로 옮기는 대신 단일 수정을 한 적이 없었기 때문에 다른 모든 .bashrc를 내 것으로 교체했습니다.

그러나 나는 무엇을 놓쳤습니까?

그렇다면, 초기 Linux 사용자에게 별칭 지정시기, 스크립트 작성시기 및 함수 작성시기에 대해 무엇을 알려주겠습니까?

분명하지 않다면, 이것에 대답하는 사람들이 세 가지 옵션을 모두 사용한다고 가정합니다. 별명 만 사용하거나 스크립트 만 사용 하거나 함수 만 사용 하거나 별명과 스크립트 또는 별명과 기능 또는 스크립트와 기능 만 사용하는 경우이 질문은 실제로 사용자를 대상으로하지 않습니다.



답변

별명은 일반적으로 명령의 기본 옵션을 변경하는 것 이상을 효과적으로 수행하지 않아야합니다. 명령 이름에 대한 단순한 텍스트 대체 일뿐입니다. 인수로는 아무것도 할 수 없지만 실제로 실행되는 명령에 전달합니다. 따라서 단일 명령 앞에 인수를 추가하면 별칭이 작동합니다. 일반적인 예는

# Make ls output in color by default.
alias ls="ls --color=auto"
# make mv ask before overwriting a file by default
alias mv="mv -i"

별명보다 복잡한 것을 수행해야하지만 자체적으로 사용되지 않는 함수를 사용해야합니다. 예를 들어 파이프 라인에 있는지 여부에 따라 기본 동작을 변경하는 것에 대한 질문 에이 대답 을 사용하십시오 grep.

grep() {
    if [[ -t 1 ]]; then
        command grep -n "$@"
    else
        command grep "$@"
    fi
}

별명에 대해 너무 복잡하기 때문에 (조건에 따라 다른 기본값이 필요함) 함수의 완벽한 예이지만 비 대화식 스크립트에는 필요하지 않습니다.

너무 많은 함수 또는 함수를 얻는 경우 숨겨진 디렉토리에 별도의 파일로 넣고 다음에서 소스를 찾으십시오 ~/.bashrc.

if [ -d ~/.bash_functions ]; then
    for file in ~/.bash_functions/*; do
        . "$file"
    done
fi

스크립트는 자체적으로 있어야합니다. 재사용하거나 여러 용도로 사용할 수있는 가치를 가져야합니다.


답변

다른 답변은 개인적인 취향을 기반으로 한 일반적인 일반적인 지침을 제공하지만 스크립트, 함수 또는 별칭 사이를 결정할 때 고려해야 할 많은 관련 사실 을 무시하십시오 .

별명 및 기능 ¹

  • 별명과 함수의 전체 내용은 쉘의 메모리에 저장됩니다.
  • 이것의 자연스러운 결과는 별칭과 함수는 현재 쉘 에서만 사용할 수 있으며 텍스트 편집기, 스크립트 또는 같은 쉘의 자식 인스턴스와 같이 쉘에서 호출 할 수있는 다른 프로그램에서는 사용할 수 없습니다.
  • 별명과 함수는 현재 셸에서 실행됩니다. 즉, 셸 내에서 실행되고 셸의 현재 환경에 영향을줍니다 .² 별명이나 함수를 실행하기 위해 별도의 프로세스가 필요하지 않습니다.

스크립트

  • 쉘은 스크립트를 메모리에 보관하지 않습니다. 대신 스크립트는 필요할 때마다 저장된 파일에서 스크립트를 읽습니다. $PATH검색을 통해 스크립트를 찾은 경우 , 많은 셸에서 경로 이름의 해시를 메모리에 저장하여 향후 $PATH조회 시간을 절약 할 수 있지만 사용하지 않을 경우 스크립트의 메모리 사용 공간 정도입니다.
  • 스크립트는 함수와 별명보다 더 많은 방법으로 호출 할 수 있습니다. 그것들은 같은 인터프리터에 인수로 전달 sh script되거나 실행 파일로 직접 호출 될 수 있습니다 .이 경우 shebang 라인 (예 :)의 인터프리터 #!/bin/sh가 호출됩니다. 두 경우 모두 스크립트는 쉘 환경과 별개로 자체 환경이있는 별도의 인터프리터 프로세스에 의해 실행되며 환경은 스크립트가 어떤 식으로도 영향을 줄 수 없습니다. 실제로 인터프리터 쉘은 호출하는 쉘과도 일치하지 않아도됩니다. 이러한 방식으로 호출 된 스크립트는 일반 실행 파일처럼 작동하므로 모든 프로그램에서 사용할 수 있습니다.

    마지막으로, .또는 일부 셸을 사용하여 현재 셸에서 스크립트를 읽고 실행할 수 있습니다 source. 이 경우 스크립트는 지속적으로 메모리에 보관되지 않고 주문형으로 읽는 기능과 매우 유사합니다.

신청

위의 내용을 감안할 때 스크립트 또는 함수 / 별칭을 만들지에 대한 일반적인 지침을 제시 할 수 있습니다.

  • 쉘 이외의 다른 프로그램에서도 사용할 수 있어야합니까? 그렇다면 스크립트 여야합니다.

  • 대화식 쉘에서만 사용할 수 있도록 하시겠습니까? 외부 명령 / 스크립트에 영향을주지 않고 대화식으로 실행할 때 많은 명령의 기본 동작을 변경하는 것이 일반적입니다. 이 경우 쉘의 “대화식 모드 전용”rc 파일에 설정된 별명 / 함수를 사용하십시오 ( bash이것은 .bashrc).

  • 쉘 환경을 변경해야합니까? 기능 / 별명 또는 소스 스크립트 모두 선택할 수 있습니다.

  • 자주 사용하는 것입니까? 메모리에 보관하는 것이 더 효율적일 수 있으므로 가능하면 기능 / 별칭으로 만드십시오.

  • 반대로, 거의 사용하지 않는 것입니까? 이 경우 필요하지 않을 때 메모리를 낭비하는 것이 의미가 없으므로 스크립트로 만드십시오.


¹ 함수와 별칭은 몇 가지 중요한 차이점이 있지만 함수는 별칭이 할 수있는 모든 작업을 수행 할 수 있으므로 그룹화됩니다. 별명은 지역 변수를 가질 수 없으며 인수를 처리 할 수 ​​없으며 한 줄보다 길면 불편합니다.

² Unix 시스템에서 실행되는 모든 프로세스 에는 기본 로케일 및 실행 가능한 검색 경로 지정 과 같은 전역 구성 설정이 포함 된 여러 쌍 으로 구성된 환경이variable=value 있습니다 .LANGPATH


답변

나는 그것이 각자의 취향에 달려 있다고 생각합니다. 나를 위해 논리는 다음과 같습니다.

  • 먼저 가장 단순하기 때문에 별칭을 만들려고합니다.
  • 일이 너무 복잡하여 한 줄에 들어 가지 않으면 기능으로 만들려고합니다.
  • 함수가 12 줄 이상으로 커지기 시작하면 스크립트에 넣습니다.

실제로 작동 하는 것을 제한하는 것은 없습니다 .


답변

적어도 부분적으로 개인적인 취향의 문제입니다. 반면에 몇 가지 명확한 기능적 차이점이 있습니다.

  • 별칭 : 간단한 텍스트 교체에만 적합하며 인수 / 매개 변수가 없습니다.
  • 기능 : 쓰기 / 사용 용이, 전체 쉘 스크립팅 기능, bash 내에서만 사용 가능
  • 스크립트 : 다소 비슷한 기능이지만 bash 외부에서도 사용 가능 (호출 가능)

쉘 스크립팅을 살펴본 결과 지난 몇 년 동안 나는 별칭 작성을 중단했습니다 (모두 시간이 지남에 따라 함수로 성장하는 경향이 있기 때문에).

추신 : alias command="bash bashscriptname"실제로이 작업을 수행 할 이유가 없습니다. bashscriptname$ PATH에 없더라도 간단 alias c=/path/to/script합니다.


답변

별명 및 함수에 대한 추가 사항은 다음과 같습니다.

  • 동일한 이름의 별칭과 기능이 공존 할 수 있습니다
  • 별칭 네임 스페이스가 먼저 조회됩니다 (첫 번째 예 참조)
  • 서브 쉘 또는 비 대화식 환경에서 별명 설정 (해제) 할 수 없습니다 (두 번째 예 참조).

예를 들면 다음과 같습니다.

alias f='echo Alias'; f             # prints "Alias"
function f { echo 'Function'; }; f  # prints "Alias"
unalias f; f                        # prints "Function"

보다시피 별명과 함수에 대한 별도의 네임 스페이스가 있습니다. 보다 자세한 내용은 declare -A -p BASH_ALIASESand를 사용하여 declare -f f정의를 인쇄합니다 (둘 다 메모리에 저장 됨).

별명 제한을 보여주는 예 :

alias a='echo Alias'
a        # OK: prints "Alias"
eval a;  # OK: prints "Alias"
( alias a="Nested"; a );  # prints "Alias" (not "Nested")
( unalias a; a );         # prints "Alias"
bash -c "alias aa='Another Alias'; aa"  # ERROR: bash: aa: command not found

보시다시피 함수와 달리 별칭은 중첩 가능하지 않습니다. 또한 사용법은 대화식 세션으로 제한됩니다.

마지막으로 다음과 같이 함수를 즉시 호출하여 선언하여 별칭에서 임의 계산을 수행 할 수 있습니다.

alias a_complex_thing='f() { do_stuff_in_function; } f'

Git 별칭의 경우 이미 널리 사용됩니다. 함수를 선언하는 것의 이점은 .동일한 이름의 함수를 선언하는 스크립트를 소스 (또는)를 사용하여 간단히 별칭을 덮어 쓸 수 없다는 것 입니다.


답변

스크립트 작성시기 …

  • 스크립트는 소프트웨어 구성 요소 (일명 도구, 명령, 프로세스, 실행 파일, 프로그램)를보다 복잡한 구성 요소로 조립합니다.이 구성 요소는 더 복잡한 구성 요소로 조립 될 수 있습니다.
  • 스크립트는 일반적으로 실행 가능하므로 이름으로 호출 할 수 있습니다. 호출되면 스크립트를 실행할 새 하위 프로세스가 생성됩니다. 모든 exported 변수 및 / 또는 함수의 사본이 을 통해 스크립트 로 전달됩니다 . 이러한 변수에 대한 변경 사항 은 부모 스크립트로 다시 전파 되지 않습니다 .
  • 스크립트는 마치 호출 스크립트의 일부인 것처럼로드 (소스) 될 수도 있습니다. 이것은 다른 언어가 “import”또는 “include”라고 부르는 것과 유사합니다. 소싱되면 기존 프로세스 내에서 실행됩니다. 하위 프로세스가 생성되지 않습니다.

함수 작성시기 …

  • 함수는 효과적으로 사전로드 된 쉘 스크립트입니다. 별도의 스크립트를 호출하는 것보다 약간 더 나은 성능을 발휘하지만 기계 디스크에서 읽어야하는 경우에만 가능합니다. 오늘날 사용되지 않는 RAM에서 플래시 드라이브, SSD 및 Linux의 일반적인 캐싱이 급격히 증가함에 따라 그 개선은 크게 측정 할 수 없습니다.
  • 함수는 모듈화, 캡슐화 및 재사용을 달성하는 bash의 주요 수단으로 사용됩니다. 스크립트의 명확성, 안정성 및 유지 관리 성을 향상시킵니다.
  • 함수를 호출하는 구문 규칙은 실행 파일을 호출하는 구문 규칙과 동일합니다. 실행 파일과 이름이 같은 함수가 실행 파일 대신 호출됩니다.
  • 함수는 스크립트에 포함되어 있습니다.
  • 함수를 익스포트 ( value로 복사 )하여 스크립트라고하는 내부에서 사용할 수 있습니다. 따라서 함수는 부모가 아닌 자식 프로세스에만 전파됩니다.
  • 함수는 종종 다른 스크립트에 의해 소싱되도록 라이브러리 (함수 정의 만있는 스크립트)로 어셈블되는 재사용 가능한 명령을 작성합니다.

별명을 쓰는시기 …

라이브러리 스크립트와 같은 스크립트 내에서 함수의 이름이 변경되었지만 이전 버전과의 호환성이 필요한 경우와 같이 함수의 별칭이 필요한 경우가 있습니다. 이것은 모든 인수를 새로운 함수에 전달하는 이전 이름으로 간단한 함수를 작성하여 수행 할 수 있습니다 …

# A bash in-script 'alias'
function oldFunction () { newFunction "$@"; }


답변

내가 믿지 않는 또 하나의 사실은 함수가 호출 프로세스의 컨텍스트에서 실행되는 반면 스크립트는 새로운 쉘을 포크한다는 것입니다.

성능이 중요 할 수 있습니다 – 그것은하지 않기 때문에 함수, 빠른 fork()exec(). 일반적인 상황에서는 그 차이가 사소한 것이지만 메모리가 부족하고 페이지 스 래싱 인 시스템을 디버깅하는 경우 큰 차이를 만들 수 있습니다.

또한 현재 쉘 환경을 수정하려면 함수를 사용해야합니다. 예를 들어, 함수 $PATH는 현재 쉘 의 명령 조회 를 변경할 수 있지만 스크립트는 fork / exec 사본에서 작동하기 때문에 스크립트를 실행할 수 없습니다 $PATH.