나처럼 이 질문을 하는 데 10년이 걸리는 사람은 없습니다. 방금 Linux를 시작했다면 다음 사항을 알고 싶습니다.언제 별칭을 사용하고, 언제 스크립트를 사용하며, 언제 함수를 작성합니까?
별칭에 관해서는 매개 변수를 사용하지 않는 매우 간단한 작업에 별칭을 사용합니다.
alias houston='cd /home/username/.scripts/'
이것은 분명한 것 같습니다. 하지만 어떤 사람들은 이렇게 합니다.
alias command="bash bashscriptname"
.bashrc
(그리고 파일 에 추가합니다 ).
이에 대한 타당한 이유가 있습니까? 나는 이런 상황을 겪지 않았습니다. 영향을 미칠 수 있는 극단적인 경우가 있는 경우 아래에 답변해 주세요.
여기가 PATH에 몇 가지 항목을 추가한 곳으로 chmod +x
, Linux에서 수년간의 시행착오 끝에 나온 또 다른 항목입니다.
그러면 다음 주제로 넘어갑니다. 예를 들어, .scripts/
( )에 줄을 추가하여 홈 디렉터리 의 숨겨진 폴더( )를 PATH에 추가하면 그 안의 모든 실행 파일이 자동으로 완성됩니다..bashrc
PATH=$PATH:/home/username/.scripts/
나한테는 그게 별로 필요하지 않지, 그렇지? 저는 Python과 같은 쉘이 아닌 언어에만 이것을 사용하겠습니다. 쉘이라면 그 안에 함수를 작성할 수 있습니다 .bashrc
.
funcname () {
somecommand -someARGS "$@"
}
내가 뭐 놓친 거 없니?
별칭을 사용해야 하는 경우, 스크립트를 작성하는 경우, 함수를 작성하는 경우에 대해 Linux 초보자에게 무엇을 말하시겠습니까?
명확하지 않다면 이 질문에 답하는 사람은 세 가지 옵션을 모두 활용할 것이라고 가정합니다. 세 가지(별칭, 스크립트, 함수) 중 하나만 사용하는 경우 이 질문은 실제로 적합하지 않습니다.
답변1
다른 답변은 개인적인 취향에 따라 몇 가지 부드러운 일반적인 지침을 제공하지만 관련 항목의 대부분을 무시합니다.사실스크립트, 함수 또는 별칭을 결정할 때 이 점을 고려해야 합니다.
별칭 및 기능 ¹
- 별칭과 함수의 전체 내용은 쉘의 메모리에 저장됩니다.
- 이에 대한 자연스러운 결과는 별칭과 함수가오직현재 셸에서 사용되며 셸에서 호출할 수 있는 다른 프로그램(예: 텍스트 편집기, 스크립트 또는 동일한 셸의 하위 인스턴스)에서는 사용되지 않습니다.
- 별칭과 함수는 현재 셸에서 실행됩니다. 즉, 셸의 현재 환경에서 실행되어 영향을 줍니다. ² 별칭이나 기능을 실행하는 데 별도의 프로세스가 필요하지 않습니다.
스크립트
- 쉘은 스크립트를 메모리에 보관하지 않습니다. 대신 필요할 때마다 저장된 파일에서 스크립트를 읽습니다. search 로 스크립트를 찾으면
$PATH
많은 쉘은 향후 조회 시간을 절약하기 위해 해당 경로 이름의 해시를 메모리에 저장$PATH
하지만 이는 사용하지 않을 때 스크립트의 메모리 공간 범위입니다. 함수와 별칭보다 스크립트를 호출하는 방법이 더 많습니다. 예를 들어 인터프리터에 인수로 전달되거나
sh script
실행 파일로 직접 호출될 수 있습니다. 이 경우#!/bin/sh
shebang 라인(예:)의 인터프리터가 실행을 위해 호출됩니다. 두 경우 모두 스크립트는 셸 환경과 별도의 자체 환경을 갖춘 별도의 인터프리터 프로세스에 의해 실행되며 스크립트는 어떤 식으로든 셸 환경에 영향을 줄 수 없습니다. 실제로 인터프리터 쉘은 호출 쉘과 일치할 필요조차 없습니다. 이런 방식으로 호출된 스크립트는 일반 실행 파일처럼 보이기 때문에 모든 프로그램에서 사용할 수 있습니다.마지막으로 스크립트 읽기 및 실행은 현재 쉘
.
또는 일부 쉘에서 사용될 수 있습니다source
. 이 경우 스크립트는 메모리에 유지되는 것이 아니라 요청 시 읽는 함수와 매우 유사하게 동작합니다.
애플리케이션
위 내용을 고려하여 무언가를 스크립트로 만들 것인지, 함수/별명으로 만들 것인지에 대한 몇 가지 일반적인 지침을 생각해 낼 수 있습니다.
쉘 외에 다른 프로그램에서 이를 사용할 수 있어야 합니까? 그렇다면 스크립트여야 합니다.
대화형 셸에서만 사용하시겠습니까? 외부 명령/스크립트에 영향을 주지 않고 대화형으로 실행할 때 많은 명령의 기본 동작을 변경하는 것이 바람직한 경우가 많습니다. 이 경우, 쉘의 "대화형 모드 전용" rc 파일(
bash
이 경우.bashrc
)에 설정된 별명/함수를 사용하십시오.쉘 환경을 바꿔야 하나요? 함수/별칭 또는 소스 스크립트가 가능한 옵션입니다.
정기적으로 사용하는 제품인가요? 메모리에 보관하는 것이 더 효율적일 수 있으므로 가능하면 함수/별칭으로 만드세요.
대신, 거의 사용하지 않는 것인가요? 이런 경우에는 필요하지 않을 때 메모리를 차지하게 놔둬도 소용이 없으니 스크립트로 만들어 보세요.
1 함수와 별칭 사이에는 몇 가지 중요한 차이점이 있지만 함수는 별칭이 수행할 수 있는 모든 작업을 수행할 수 있으므로 함께 그룹화됩니다. 별칭은 지역 변수를 가질 수 없고, 매개변수를 처리할 수 없으며, 한 줄보다 긴 것에 대해서는 불편합니다.
² Unix 시스템에서 실행 중인 각 프로세스에는환경일반적으로 기본 로케일 및 지정된 실행 가능 검색 경로 variable=value
와 같은 전역 구성 설정을 포함하는 여러 쌍 으로 구성됩니다.LANG
PATH
답변2
실제로 별칭(일반적으로)은 명령의 기본 옵션만 변경해서는 안 됩니다. 이는 명령 이름의 간단한 텍스트 교체에 지나지 않습니다. 인수를 실제로 실행하는 명령에 전달하는 것 외에는 인수로 아무 것도 할 수 없습니다. 따라서 단일 명령 앞에 매개변수만 추가해야 하는 경우 별칭을 사용할 수 있습니다. 일반적인 예는 다음과 같습니다
# 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
스크립트는 그 자체로 존재해야 합니다. 재사용하거나 다양한 목적으로 사용할 수 있는 가치가 있어야 합니다.
답변3
나는 그것이 모든 사람의 취향에 달려 있다고 생각합니다. 나에게 논리는 다음과 같습니다.
- 먼저 별칭을 만들어 보았습니다. 그것이 가장 쉬웠기 때문입니다.
- 한 줄로 표현하기에는 너무 복잡한 내용이 있으면 함수로 변환하려고 노력합니다.
- 함수가 12줄 이상으로 커지기 시작하면 이를 스크립트에 넣습니다.
당신이 뭔가를 하는 것을 제한하는 것은 정말로 아무것도 없습니다일하다.
답변4
스크립트를 언제 작성해야 하는지...
- 스크립트는 소프트웨어 구성 요소(도구, 명령, 프로세스, 실행 파일, 프로그램이라고도 함)를 더 복잡한 구성 요소로 조립하며, 이 구성 요소 자체는 더 복잡한 구성 요소로 조립될 수 있습니다.
- 스크립트는 일반적으로 실행 가능하므로 이름으로 호출할 수 있습니다. 호출되면 스크립트를 실행할 새 하위 프로세스가 생성됩니다. ed
export
변수 및/또는 함수의 복사본은 다음과 같습니다.값으로 전달스크립트에. 이러한 변수가 변경되면아니요상위 스크립트로 다시 전파합니다. - 스크립트는 호출 스크립트의 일부인 것처럼 로드(소스 제공)될 수도 있습니다. 이는 다른 언어에서 "가져오기" 또는 "포함"이라고 부르는 것과 유사합니다. 소싱되면 기존 프로세스 내에서 실행됩니다. 하위 프로세스가 생성되지 않습니다.
함수를 작성하는 경우...
- 함수는 실제로 미리 로드된 쉘 스크립트입니다. 성능은 별도의 스크립트를 호출하는 것보다 약간 더 좋지만 기계식 디스크에서 읽는 경우에만 가능합니다. 오늘날 플래시 드라이브, SSD, 사용되지 않는 RAM에 있는 Linux의 일반 캐시가 확산되면서 이러한 개선은 거의 측정할 수 없게 되었습니다.
- 함수는 bash가 모듈화, 캡슐화 및 재사용을 달성하는 주요 수단입니다. 스크립트 명확성, 안정성 및 유지 관리 가능성이 향상됩니다.
- 함수 호출에 대한 구문 규칙은 실행 파일 호출에 대한 구문 규칙과 동일합니다. 실행 파일 대신 실행 파일과 동일한 이름을 가진 함수가 호출됩니다.
- 함수는 해당 함수가 위치한 스크립트에 대해 로컬입니다.
- 함수를 내보낼 수 있습니다(값으로 복사) 호출 스크립트에서 사용할 수 있습니다. 따라서 함수는 상위 프로세스가 아닌 하위 프로세스에만 전파됩니다.
- 함수는 다른 스크립트가 선택할 수 있도록 종종 라이브러리(함수 정의만 있는 스크립트)로 조립되는 재사용 가능한 명령을 생성합니다.
별칭을 작성하는 경우...
- 불다if/then 및 for/do 루프와 같은 셸 스크립트 구성에서는 별칭이 작동하지 않습니다.이므로 대화형 명령줄에서 키보드 단축키로만 사용할 수 있습니다. 따라서 모든 별칭 정의는 일반적으로
~/.profile
또는 같은 적절한 로그인 스크립트에 있습니다~/.bashrc
.
라이브러리 스크립트와 같은 스크립트에서는 함수 이름이 바뀌었지만 이전 버전과의 호환성이 필요한 경우와 같이 함수에 대한 별칭이 필요한 경우가 있습니다. 이는 모든 인수를 새 함수에 전달하는 이전 이름으로 간단한 함수를 생성하여 수행할 수 있습니다.
# A bash in-script 'alias'
function oldFunction () { newFunction "$@"; }
alias
이 명령과 기타 셸에 대한 포괄적인 설명은 다음 에서 확인할 수 있습니다 .bash
위키피디아/별칭(명령)