이 도우미 bash 함수를 구현하려고 합니다.
ores_simple_push(){(
set -eo pipefail
git add .
git add -A
args=("$@")
if [[ ${#args[@]} -lt 1 ]]; then
args+=('squash-this-commit')
fi
git commit -am "'${args[@]}'" || { echo; }
git push
)}
with: git commit -am 'some stuff here'
, 저는 따옴표를 입력하는 것을 정말 좋아하지 않으므로 다음을 원합니다.
ores_simple_push my git commit message here gets put into a single string
이는 다음과 같습니다:
git commit -am 'my git commit message here gets put into a single string'
이를 수행하는 합리적인 방법이 있습니까?
답변1
Korn/POSIX와 유사한 쉘에서 "$@"
모든 위치 인수로 확장할 때 설정되지 않은 경우 분리(목록 컨텍스트에서)하거나 "$*"
첫 번째 문자(일부 쉘의 바이트) 또는 SPC를 사용하여 위치 인수로 확장합니다. if 가 없는 $IFS
연결 빈 문자열로 설정됩니다.$IFS
$IFS
ksh
/// zsh
(배열을 지원하는 Bourne과 유사한 쉘 bash
) 의 vs yash
도 마찬가지입니다 ."${array[@]}"
"${array[*]}"
에서는 / 와 같고, zsh
/ 에서는 와 같습니다 . 에서는 와 동일합니다 ."$array"
"${array[*]}"
ksh
bash
"${array[0]}"
yash
"${array[@]}"
에서는 매개변수 확장 플래그를 사용하여 zsh
배열 요소를 임의의 구분 기호로 연결할 수 있습니다. 예를 들어 공간적으로 연결할 수 있습니다. 단일 문자/바이트 문자열로 제한되지 않고 매개변수 확장 플래그를 사용하여 구분 기호 사양에서 이스케이프 시퀀스나 변수를 사용할 수도 있습니다(예: TAB에서 연결 및 연결). 줄 바꿈(동일)과 연결된 바로가기 플래그도 참조하세요.j
"${(j[ ])array}"
"${(j[ and ])array}"
p
"${(pj[\t])array}"
"${(pj[$var])array}"
$var
F
pj[\n]
그래서 여기 있습니다:
ores_simple_push() (
set -o errexit -o pipefail
git add .
git add -A
args=("$@")
if [[ ${#args[@]} -lt 1 ]]; then
args+=('squash-this-commit')
fi
IFS=' '
git commit -am "${args[*]}" || true
git push
)
아니면 그냥 POSIXly:
ores_simple_push() (
set -o errexit
git add .
git add -A
[ "$#" -gt 0 ] || set square-this-commit
IFS=' '
git commit -am "$*" || true
git push
)
일부 쉘(bash, ksh93, mksh 및 bosh는 포함하지만 dash, zsh 또는 yash는 포함되지 않음)에 대해 "${*-square-this-commit}"
여기에서 이를 사용할 수도 있습니다.
완전성을 위해 bash
배열을 임의의 문자열(zsh와 동일)과 연결하려면 joined=${(ps[$sep])array}
다음을 수행할 수 있습니다.
IFS=
joined="${array[*]/#/$sep}"
joined=${joined#"$sep"}
(이것이 로케일의 유효한 텍스트라고 가정합니다. 그렇지 않은 경우 의 $sep
내용이 나머지 내용과 연결되어 궁극적으로 유효한 텍스트를 형성할 때 두 번째 단계가 실패할 수 있습니다.)$sep
1 역사적으로 볼 때 Bourne 쉘에서는 SPC와 결합됩니다.$IFS
답변2
실제로 이것은 작동하는 것 같지만 이유는 모르겠습니다.
git commit -am "${args}" || { echo; }