쉘 별명에 명령 행 인수를 전달하는 방법은 무엇입니까?


288

명령 행 인수를 별명에 어떻게 전달합니까? 다음은 샘플입니다.

별명 mkcd = 'mkdir $ 1; cd $ 1; '

그러나이 경우 $ xx는 런타임이 아닌 별명 작성 시간에 변환됩니다. 그러나 다음과 같이 쉘 기능 (약간 인터넷 검색 후)을 사용하여 해결 방법을 만들었습니다.

함수 mkcd () {
  mkdir $ 1
  CD $ 1
}

CL 매개 변수를 허용하는 별명을 작성하는 방법이 있는지 알고 싶었습니다.
BTW-기본 쉘로 'bash'를 사용합니다.



2
O / T이지만 mkcd 함수를 대신하는 대안으로 다음과 같이 작성할 수 있습니다.mkdir mydirectoryname && cd $_
moala

답변:


174

당신은 방법을 찾았습니다 : 별명 대신 함수를 만드십시오. C 쉘에는 별명에 대한 인수를 수행하는 메커니즘이 있지만 함수 메커니즘이 더 유연하고 동일한 기능을 제공하기 때문에 bash 및 Korn 쉘은 그렇지 않습니다.


그러나 .bashrc파일 에서 별명을 작성할 때 기능이 필요하지 않습니다 . 예를 들어 # 사용자 별칭 serve = "python -m SimpleHTTPServer $ 1"에 의해 포트 번호를 사용하는 별명을 작성하십시오. .bashrc 파일을 변경 한 후 다음 명령을 입력하십시오. ~ $ source .bashrc 이렇게 사용할 수 있어야합니다 ~ $ serve 8998
kaizer1v

8
@ kaizer1v, CentOS7.3 bash 버전 4.2.46에 대한 나의 관찰은 당신이 생각하는대로 제안이 작동하지 않는다는 것입니다. 큰 따옴표를 사용하고 있으므로 $ 1은 실제로 빈 문자열로 평가되고 별명은 실제로 alias serve = "python -m SimpleHTTPServer"와 동일하므로 해당 별명 이후에 전달하는 것은 명령 행에 ALSO로 전달됩니다. 이 설정을 시도하면 -x; alias serve = "python -m SimpleHTTPServer $ 1 &"오류 / 문제가 표시됩니다. 인수와 별명 명령은 모두 별도의 명령으로 실행됩니다.
PatS

279

Bash 에서 다른 쉘에 대해 게시 된 내용을 반복하기 위해 다음 작업이 수행됩니다.

alias blah='function _blah(){ echo "First: $1"; echo "Second: $2"; };_blah'

다음을 실행하십시오.

blah one two

아래 출력을 제공합니다.

First: one
Second: two

4
훌륭한 솔루션. bash 초보자의 몇 가지 질문 : 함수의 이름을 밑줄로 지정해야합니까 (또는 전혀 다르게) 가독성을 위해서입니까? 함수 정의에서 후행 "; _blah"의 목적은 무엇입니까? 작은 따옴표 대신 큰 따옴표를 사용하는 경우 ($ 1이 올바르게 해석되지 않음) $ 1 주위에 따옴표가 필요없는 작업을 수행 할 때 왜 작동하지 않습니까? 조언에 미리 감사드립니다. 나는 해결책을 가지고 있지만 왜 그것이 효과가 있는지에 대해 더 많이 이해하고 싶습니다.
mynameispaulie

4
@mynameispaulie 함수의 이름은 무엇이든 지정할 수 있습니다. 그것은 도움에 대한 공통 트릭 방지이기 때문에 나는 밑줄 접두사를 사용했습니다 이름 충돌 (동일한 이름을 가진, 즉 다른 함수)
토마스 브랫

6
이중 따옴표 수 @mynameispaulie Bash교체 $1$2함수에 전달 된 매개 변수와 함께. 작은 따옴표는 Bash에게 이것을하지 말라고 지시합니다.
Thomas Bratt

5
이 별칭 / 함수 콤보 복사 / 붙여 넣기를 많이 보았지만 유용한 목적으로 사용되지 않는 것 같습니다. 표준 접근법은 정상적인 이름으로 함수를 한 번 정의하고 별명을 갖지 않는 것입니다.
Tripleee

16
나는 이것이 어떻게 선호되는지 function blah(){ echo "First: $1"; echo "Second: $2"; }
알지 못한다

57

ksh에서는 불가능하지만 csh에서는 가능합니다.

alias mkcd 'mkdir \!^; cd \!^1'

ksh에서 기능은 갈 길입니다. 그러나 정말로 별명을 사용하고 싶다면 :

alias mkcd='_(){ mkdir $1; cd $1; }; _'

흥미로운 부수적으로, 모든 사람들이 최근에 이야기 한 원격 코드 실행 취약점은 거의 똑같은 작업을 수행하지만 원시 사용자 입력에 의해 설정되는 환경 변수와 관련이 있다고 생각합니다. openwall.com/lists/oss-security/2014/09/24/11
Floegipoky 2014 년

@Floegipoky-env var가 아닌 별칭에 있기 때문에 실질적으로 다릅니다. ShellShock 문제는 환경 변수가 설정 될 때 실행된다는 것입니다. 환경 변수 설정은 안전한 작업으로 간주됩니다. 위 별칭이 설정되어 있으면 별칭이 실행될 때만 스크립트가 실행되지 않습니다.
Sanjaya R

아마도 csh현대인이 사용하고 싶지 않은 것이 지적되었을 것 입니다. 함수를 생성 한 다음 그 함수 간접 처리를 생성하는 별칭은 상대적으로 인기가 있지만 내가 알 수있는 한 적절한 함수에 비해 이점이 없습니다. (어쨌든 함수는 적절하게 인수를 인용해야합니다.) Downvoting.
tripleee

17

bash 맨 페이지를 인용하려면 :

대체 텍스트에 인수를 사용하는 메커니즘은 없습니다. 인수가 필요한 경우 쉘 기능을 사용해야합니다 (아래의 기능 참조).

그래서 당신이 당신의 자신의 질문에 대답 한 것처럼 보입니다-별칭 대신 함수를 사용하십시오



5

함수를 ~/.cshrc파일 로 쓸 수 없다는 것을 알았습니다 . 여기에 인수를 취하는 별칭으로

예를 들어 'find'명령에 인수가 전달되었습니다.

alias fl "find . -name '\!:1'"     
Ex: >fl abc

여기서 abc는! : 1로 전달 된 인수입니다.


4
기본 쉘이 bash 인 OP에는 유용하지 않습니다. 그리고 Sanjaya R의 답변은 4 년 전 csh 별칭을 언급했습니다.
Keith Thompson

1
Sanjaya R의 답변은 무슨 !:1의미 인지 설명하지 못했습니다 . 나는 그것이 논쟁 이었다는 것을보기 위해 아래로 스크롤해야했습니다. 좋은 답변은 OP 쉘 유형이 아니더라도 더 많은 질문을 남기지 않습니다.
searchengine27

4

가장 쉬운 방법은 별칭이 아닌 함수를 사용하는 것입니다. cli에서 언제든지 함수를 호출 할 수 있습니다. bash에서는 함수 이름 () {command}를 추가하면 별칭과 동일하게로드됩니다.

function mkcd() { mkdir $1; cd $1 ;}

다른 껍질에 대해 잘 모름



1

이것은 ksh에서 작동합니다.

$ alias -x mkcd="mkdir \$dirname; cd \$dirname;"
$ alias mkcd
mkcd='mkdir $dirname; cd $dirname;'
$ dirname=aaa 
$ pwd
/tmp   
$ mkcd
$ pwd
/tmp/aaa

"-x"옵션은 별명을 "내 보낸"-별명을 서브 쉘에 표시합니다.

스크립트에 정의 된 별칭은 해당 스크립트에 표시되지 않습니다 (줄이 해석 될 때가 아니라 스크립트가로드 될 때 별칭이 확장되므로). 이것은 동일한 쉘에서 다른 스크립트 파일을 실행하여 해결할 수 있습니다 (점 사용).



-2

다음은 파이썬을 사용한 간단한 예제 함수입니다. ~ / .bashrc에 붙일 수 있습니다
첫 번째 왼쪽 중괄호 뒤에 공백이 있어야합니다
. 파이썬 명령은 큰 따옴표로 묶어야 변수 대체를 얻을 수 있습니다
. 끝에 세미콜론을 잊지 마십시오.

function count () {python -c "xrange ($ 1)의 숫자의 경우 : print num";}

$ count 6
0
1
2
3
4
5
$

-5

빈 별칭은 인수를 실행합니다.

alias DEBUG=

12
담당자가 SO (Stack Overflow)를 처음 사용한다는 것을 알았습니다. 답변 투표에 실망하지 마십시오. OP (Original Poster)가 대답 한 질문에 실제로 답변하지 않기 때문에 투표가 거부되었습니다. 그들의 전화를 끊고 계속 노력하십시오. 또한 대답 할 때 답이 어떻게 작동하는지에 대한 간단한 예를 포함시키고 결과를 보여주십시오. 이를 통해 다른 사람들이 귀하의 답변이 어떻게 작동하는지 확인할 수 있습니다.
PatS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.