이는 옵션 및/또는 인수를 허용하는 bash 스크립트를 작성하기 위한 프레임워크입니다. 간단한 선언적 구문을 사용하여 스크립트에서 허용되는 옵션과 인수를 정의하고 bash-args를 허용합니다.
사용이 간편하고 방해가 되지 않으며 세련된 사용자 경험을 제공하도록 설계되었습니다.
이식성을 목표로 하며 테스트 스위트는 bash >= 3.2의 모든 주요 버전을 통과합니다.
스크립트에서 bash-args를 사용하려면 init.sh
파일을 소스로 제공하기만 하면 됩니다.
다음은 eval-command.sh
스크립트 예시입니다.
#! /usr/bin/env bash
# Summary : My first bash script using bash-args.
#
# Description : This takes a command as argument, and runs it.
#
# Argument : command
#
# Options :
#
# % dry-run
# desc="Don't execute, just print."
# short="n" type="flag" variable="dry_run" value=1 default=0
#
# % directory
# desc="The directory in which to run the command." argument=directory
# short="d" type="option" variable="directory" default="$(pwd)"
#
. path/to/bash-args/init.sh
# After sourcing the script, you can use the $directory and the $dry_run
# variables to get the values of the options typed (or not) in the command line.
# The other arguments are available as standard bash arguments $1, $2, etc.
command= " cd $directory && $1 "
if [[ $dry_run -eq 1 ]] ; then
echo " $command "
else
eval " $command "
fi
옵션을 사용하여 이 명령을 실행해 보겠습니다.
$ eval-command.sh --dry-run --directory /home 'echo hello'
cd /home && echo hello
짧은 옵션을 사용할 수 있으며 그룹화할 수 있습니다.
$ eval-command.sh -nd /home 'echo hello'
cd /home && echo hello
간단한 명령으로 설정 탭 완성:
$ eval $(eval-command.sh _register_completion)
도움말 페이지가 제공됩니다:
$ eval-command.sh --help
My first bash script using bash-args.
Usage : eval-command.sh [OPTIONS] [COMMAND]
This takes a command as argument, and runs it.
Options :
--help | -h
Show this help.
--dry-run | -n
Don't execute, just print.
--directory | -d [DIRECTORY]
The directory in which to run the command.
Bash-args는 하위 명령도 관리할 수 있습니다.
main-script.sh help subcmd1
또는 main-script.sh subcmd1 --help
사용하여 각 명령에 대한 도움말 페이지를 사용할 수 있습니다. 이를 수행하려면 기본 스크립트 끝에서 cmd_run
함수를 호출하고 cmd/
디렉터리에 쉘 스크립트를 추가하여 하위 명령을 정의합니다. 프로젝트 구조는 다음과 같아야 합니다.
main-script.sh
cmd/
- subcmd1.sh
- subcmd2.sh
하위 명령을 문서화하고 해당 옵션과 인수를 정의하려면 기본 스크립트에서와 마찬가지로 각 하위 명령의 첫 번째 주석 블록에 메타데이터를 작성합니다.
기본 스크립트에 정의된 옵션은 모든 하위 명령에 사용할 수 있는 반면, 하위 명령에 정의된 옵션은 이 특정 하위 명령에만 사용할 수 있습니다.
스크립트 메타데이터는 매우 간단한 구문을 따릅니다. 첫 번째 주석 블록에서 단어로 시작하고 그 뒤에 세미콜론이 오는 각 줄은 새 필드를 정의하고 세미콜론 뒤의 모든 항목은 해당 값을 정의합니다. 다음 필드 시작까지 다음 행이 값에 추가됩니다.
bash-args 에서 사용하는 필드는 다음과 같습니다.
--version
옵션이 제공됩니다.옵션은 예제 스크립트와 같이 옵션 메타데이터에 정의됩니다.
# Options :
#
# % dry-run
# desc="Don't execute, just print."
# short="n" type="flag" variable="dry_run" value=1 default=0
#
# % directory
# desc="The directory in which to run the command." argument=directory
# short="d" type="option" variable="directory" default="$(pwd)"
#
옵션은 %
로 시작하고 그 뒤에 해당 이름이 옵니다. 옵션 이름에는 영숫자 문자( _
또는 -
만 포함되어야 합니다.
다음 줄은 옵션의 매개변수를 정의합니다. 스크립트가 실행되면 이는 실제로 bash 코드로 평가됩니다. 정의된 변수는 옵션의 매개변수입니다. 이는 문자열에 대한 일반적인 인용 규칙이 적용되며 위의 예에서와 같이 directory
옵션의 default
매개변수가 $(pwd)
로 설정된 옵션을 동적으로 정의할 수 있음을 의미합니다.
옵션은 최소한 type
및 variable
매개변수를 정의 해야 합니다 .
type
flag
또는 option
일 수 있습니다. 플래그는 인수를 허용하지 않지만 옵션은 허용합니다.variable
는 스크립트에서 옵션의 인수 값을 사용할 수 있는 변수 이름입니다.옵션은 다음과 같은 다른 매개변수를 정의 할 수 있습니다 .
desc
도움말 페이지에서 사용되는 옵션에 대한 설명입니다.short
는 짧은 옵션에 사용되는 단일 문자입니다.argument
인수 유형입니다. 인수 유형을 참조하세요.default
은 사용자가 입력한 명령에 옵션이 지정되지 않은 경우 옵션이 취하는 값입니다.value
옵션이 지정 될 때 옵션이 취하는 값이지만 인수는 없습니다. 옵션에 의해 정의된 변수는 스크립트에 정의되는 것이 보장됩니다. bash-args가 옵션 값을 찾을 수 없으면 오류와 함께 종료됩니다. 즉, 옵션의 default
지정하지 않은 경우 이 옵션 없이 기본 스크립트를 실행하면 오류가 반환됩니다.
즉, 옵션이 필요하지 않도록 하려면 해당 정의에서 default
매개변수를 정의하세요.
value
매개변수도 비슷한 방식으로 작동합니다. 지정하지 않으면 옵션을 사용할 때 인수가 필요합니다. 그렇게 하면 인수 없이 옵션을 사용할 수 있습니다.
플래그 옵션은 동일한 방식으로 작동하며 인수를 사용하지 않으므로 default
과 value
매개변수를 모두 정의해야 합니다.
Bash-args는 Bash의 완성 API를 사용하여 스크립트의 자동 완성을 처리할 수 있습니다. 명령에 대한 자동 완성을 활성화하려면 다음 명령을 실행하십시오.
eval $( my-command.sh _register_completion )
그런 다음 탭 완성 기능은 해당 단어가 -
로 시작하는 경우 정의된 옵션을 제안하고 그렇지 않은 경우 하위 명령 및 인수를 제안합니다.
bash-args 에 인수로 제안할 내용을 알려주려면 스크립트(또는 하위 명령)의 Argument
메타데이터 또는 옵션의 argument
매개변수에 인수 유형을 지정합니다.
내장 인수 유형은 다음과 같습니다.
새 인수 유형을 생성하고 자동 완성을 설정하려면 _complete_my_arg_type
이라는 함수를 정의하세요. 이 함수는 init.sh
스크립트에서 사용할 수 있어야 하므로 . init.sh
라인.
완성 함수는 전역 COMP_REPLIES
배열에 제안을 추가해야 합니다. 편의를 위해 현재 단어를 매개변수로 가져오지만 모든 bash 완성 스크립트에서와 마찬가지로 COMP_LINE
및 COMP_POINT
전역 변수를 사용할 수도 있습니다.
파일 인수 유형이 정의되는 방법은 다음과 같습니다.
_complete_file () {
# $1 is the word being typed that we want to complete.
for file in " ${1-} " * ; do
# add each file to the completion candidates.
COMP_REPLIES+=( " $file " )
done
}