별칭 명령에 인수를 전달할 수 있습니까?


19

별칭 명령으로 인수를 전달할 수 있는지 알고 싶습니다.

예를 들면 다음과 같습니다.

alias d="dmesg|grep -iw usb|tail -5" 

이제 d마지막 5 줄을 인쇄합니다. d를 사용하여 다른 수의 행을 인쇄하려면 alias 명령 선언을 d다시 변경해야 합니다.

줄 수를 변경하기 위해 선언을 다시 입력 할 필요가 없도록 별칭 선언을 수정할 수있는 방법이 있습니까? d?에 대한 별칭을 선언하면서 인수로 줄 수를 전달하는 것처럼 ? 아니면 이것을 해결할 다른 방법이 있습니까?


(t) csh에서 "\! *"는 별명에 대한 인수를 참조합니다 (역 슬래시는 "히스토리"를 의미하는 느낌표를 이스케이프하는 것입니다). 어떻게 기억할 수는 없더라도 개별 인수를 참조 할 수도 있습니다. 따라서 아마도 "tail -n \! *"또는 무언가 (\! *는 바로 앞에 빼기 기호와 함께 작동하지 않을 것이라고 생각합니다). 그러나 이것이 (ba) sh에서 작동하는지 확실하지 않습니다.
barrycarter

답변:


20

별명은 논쟁을하지 않습니다. 별칭이 좋아으로 alias foo='bar $1'는이 $1별명이 실행될 때 (가능성이 아무것도 없음) 쉘의 첫 번째 인수에 쉘에 의해 확장됩니다.

그래서 : 사용 기능을 대신.

d () {
  num=${1:-5}
  dmesg |grep -iw usb|tail -$num
}

num=${1:-5} 제공되지 않은 경우 기본값이 5 인 첫 번째 인수를 사용합니다.

그럼 당신은 할 수 있습니다 :

$ d
# prints 5 lines
$ d 10
# prints 10 lines

또는 옵션을 약간 변경 한 경우 :

alias d="dmesg|grep -iw usb|tail -n 5"

그런 다음 추가 -n옵션을 전달할 수 있습니다.

$ d
# prints 5 lines
$ d -n 10
# prints 10 lines

에 여러 -n옵션이 지정된 경우 tail마지막 옵션 만 사용됩니다.


기능적으로 자신과 같은 장애인을위한 기능 ... 즉 넣어 곳 : 그것은 잠시 상태에 도움이 될 수 ~/.bashrc또는 rc.local또는 어디를?
WinEunuuchs2Unix

별명을 넣었을 때마다 @ WinEunuuchs2Unix.
muru

5

SOhere에 설명 된대로이를위한 기능이 필요합니다 . 다음을 시도하십시오 :

foo() { /path/to/command "$@" ;}

와 전화 foo:

foo arg1 arg2 arg3

4

group 명령 및 here-string을 사용하여 별명 제한 사항 해결

별명은 인수를 취할 수 없지만 "시뮬레이션"할 수 있습니다. 이 질문에 대한 나의 대답의 예를 들어 보자 .

alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'

여기서 일어나고있는 요점 :

  • read내장 변수를 사용 하여 문자열을 변수로 읽습니다 d. 빈 문자 (줄 바꿈, 탭, 공백)를 포함하여 전체 문자열을 읽으려면 IFS=백 슬래시 이스케이프를 사용 하여 사용하지 않도록 설정 -r합니다.
  • <<<어떤은 여기 문자열 연산자는 우리가에 인수로 제공 어떤 문자열 리디렉션 할 수 있습니다 mkcd별칭; 사용법은mkcd "some directory"
  • 별명 내의 여러 명령은 { list; }구조를 사용하여 현재 쉘에서 결합되어 실행됩니다 ( 매뉴얼 group command에서 알려진 bash). 선행 공백 {;개별 명령 목록이 필요합니다.

구체적인 예에서 우리는 다음을 수행 할 수 있습니다.

alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'

공백으로 분리 된 인수를 저장하기 위해 단어 분할을 사용할 수도 있습니다.

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "arg1 arg2"
arg1
arg2

또는 배열을 사용하여 여러 인수를 제공 할 수 있습니다.

bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";}  <<< "arg1 arg2"
arg2
arg1

그러나이 좋은 접근 방식입니까?

반드시 그런 것은 아닙니다. 이러한 접근 방식의 문제점은 매우 구체적이라는 것입니다-인수를 쉽게 인용 할 수 없으므로 공백이없는 인수 만 가질 수 있습니다.

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "'arg1 with space' arg2"
'arg1
with space' arg2

물론 이것은 실제 세계에서는 복잡한 주장을 다루어야하기 때문에 널리 사용되는 것은 아니며, 따라서이 방법은 실용적이지 않습니다. 기능이 훨씬 유연합니다. 그리고 args 문자열을 인용해야 할 필요성이 빨라집니다.

한계에도 불구하고, 간단한 문자열을 인수로 사용하여 단어 분할을 할 수 있으므로 부분적으로 별칭에 인수를 줄 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.