Mac에서는 bash 쉘을 사용하고 있습니다.
실행할 수 있도록 쉘 스크립트 "gac"를 작성하고 싶습니다
> gac one two three
생산하다정확히달리는 것과 같은 효과
> git add .
> git commit -m "one two three"
지금까지 내 스크립트는 다음과 같습니다.
function gac() {
git add .
concatenated="'$*'"
git commit -m "$concatenated"
}
쉘 매개변수를 공백으로 구분된 단일 문자열(스크립트의 두 번째 줄)로 연결하는 방법을 찾았습니다.여기. 위 스크립트는 로그 메시지 읽기를 제외하고 거의 작동합니다.
a382806 'one two three'
대신 쉘 스크립트를 사용할 때
a382806 one two three
수동으로 입력하면
> git commit -m "one two three"
명령줄에서.
어떤 아이디어가 있나요?
답변1
당신이 배치할 때큰따옴표약확장, 그런매개변수 확장 $*
, 확장된 텍스트는 다음의 영향을 받지 않습니다.분사. (이것이 확장 주위에 큰따옴표를 사용하는 이유 중 하나입니다 $
. 또 다른 이유는 다음과 같습니다.와일드카드.) 또한 큰따옴표 안에는아포스트로피특별하게 취급되지 않으므로 참조를 수행하지 않으며,삭제됨.
그래서마이클 호머 라고, 그냥 해도 돼요거짓 '
'
플래그를 생략하다귀하의 기능이 작동해야합니다. 다음과 같이 작성하는 것이 좋습니다.
gac() {
git add .
git commit -m "$*"
}
키워드를 사용하여 function
Bash에서 함수를 정의할 수 있지만 위에 표시된 구문은 Bourne 스타일 셸 전체에서 동일하게 유효하고 이식 가능합니다.
여기에서 개념적 문제를 보다 직접적으로 해결하기 위해 원본 코드의 이 줄은 값에 공백이 포함된 매개 변수를 확장하여 이를 단일 매개 변수로 다음에 전달할 수 있음을 나타냅니다 git
.
concatenated="'$*'"
공백이 포함된 단일 인수를 직접 작성하는 경우 일반적으로 전체 문자열을 따옴표로 묶어 공백을 인용해야 합니다. 존재감'
'
~에그 "
"
줄에는 일반적으로 입력하는 따옴표를 포함하려고 한다는 의미입니다.
이 방법이 안되는 이유는셸 자체는 따옴표를 해석합니다. 일반적으로 셸에서 실행하는 명령에는 아무런 의미가 없습니다.. 다음 명령이 있다고 가정해 보겠습니다.
some-command 'foo bar' baz
이 명령은 실제로 명령에 따옴표를 전달하지 않습니다 some-command
. 대신 다음 some-command
과 같이 실행됩니다.foo bar
토론1과 baz
매개변수 2. (프로그램 실행 방법을 알려주는 인수 0도 있습니다. 쉘은 some-command
이를 전달합니다.)
따옴표를 사용하면 다음을 수행할 수 있습니다.쉘에게 말해논쟁이 시작되고 끝나는 곳. 공백은 일반적으로 쉘에 각 측면의 텍스트를 별도의 인수로 처리하도록 지시합니다.1, 그러나 인용이 수행하는 것과 같은 쉘에 대한 공백의 특별한 의미를 억제하려고 합니다. inside '
'
inside 와 같이 따옴표가 인용되면 "
"
제거됩니다.그들의특별한 의미도 있습니다. 그런 다음 인용문을 실행하는 대신 git
로그에 표시된 대로 문자 그대로 전달된 명령을 사용합니다.
a382806 'one two three'
1 쉘 작동 중, 공백 및 탭은 서로 관련되어 있지만 서로 다른 두 가지 방식으로 텍스트를 별도의 단어로 나눕니다. 첫 번째,명령이 처음으로 구문 분석될 때, 인용되지 않은 공백 및 탭은 어휘 태그를 구분합니다. 다른메타 문자이 작업도 수행할 수 있지만 추가 효과가 있습니다. 예를 들어 ;
한 줄을 여러 명령으로 분할하는 것입니다. 2. 어디서매개변수 확장아니면 다른 어떤쉘 확장로 표현되는$
2인용되지 않은 컨텍스트에서 실행되면 결과는 즉시 영향을 받습니다.분사, 어느문자를 $IFS
구분 기호로 사용. 이것기본값IFS
공백, 탭, 개행 문자가 차례로 옵니다.
2또는명령 대체, 구문 `
`
대신 구문을 사용하는 경우에도 마찬가지입니다 $(
)
.