나는 bash에서 alias
.
g=date
$g
Mon Jun 27 13:00:40 MYT 2016
이것은 작동합니다. 또 다른 예는 다음과 같습니다.
jj="ping yahoo.com"
$jj
PING yahoo.com (98.138.253.109) 56(84) bytes of data.
64 bytes from ir1.fp.vip.ne1.yahoo.com (98.138.253.109): icmp_seq=1 ttl=41 time=347 ms
64 bytes from ir1.fp.vip.ne1.yahoo.com (98.138.253.109): icmp_seq=2 ttl=41 time=345 ms
64 bytes from ir1.fp.vip.ne1.yahoo.com (98.138.253.109): icmp_seq=3 ttl=41 time=345 ms
이 버전의 bash를 사용하고 있습니다bash --version GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
나는 조사했다스택 교환그리고TLDP 흡수 값, 하지만 우리가 이것을 할 수 있다는 것을 찾지 못했습니다. 그렇다면 이것이 bash의 새로운 기능인가요, 아니면 간과된 것인가요? 이것이 고려되는가?명령 대체?
답변1
대화형 사용 시 쉘은 터미널 장치에서 입력 행을 읽습니다. 한 줄을 입력한 후,에프으로 분할하여토큰(단어 및 연산자). 그러면 토큰이나 단어가 특정 순서로 확장되거나 구문 분석됩니다.
참고: 일반적으로 고급 Bash 스크립팅 가이드, 온라인 튜토리얼, 서적 또는 Stack Exchange와 같은 보조 소스보다는 프로젝트 문서 또는 산업 사양과 같은 정식 정보 소스를 참조하는 것이 더 좋습니다. 이러한 보조 소스는 개념을 더 간단한 언어로 소개하고 설명하는 데 유용하지만 일반적으로 공식 문서를 완성하거나 대체하기 위한 것은 아닙니다. 보조 소스의 정보도 최신 정보가 아닐 수 있습니다.
이 경우,간단한 명령을 구문 분석하기 위한 POSIX 사양지적
- 변수 할당이나 리디렉션이 아닌 단어는 확장되어야 합니다. 확장 후 남은 필드가 있는 경우 첫 번째 필드는 명령 이름으로 처리되어야 하며 나머지 필드는 명령에 대한 인수입니다.
이것간단한 명령 확장에 대한 Bash 매뉴얼 섹션도 지적했다
- 변수 할당이나 리디렉션이 아닌 단어는 확장됩니다(셸 확장 참조). 확장 후 남은 단어가 있는 경우 첫 번째 단어는 명령 이름으로 처리되고 나머지 단어는 인수로 처리됩니다.
답변2
이는 명령 대체가 아닙니다.바꾸다치환. 명령을 변수에 할당하는 대신 문자열을 할당합니다. 명령은 값이 할당될 때가 아니라 변수를 사용할 때 실행됩니다.
g=date
문자열을 date
변수에 저장합니다 g
. 그런 다음 를 실행하면 echo "$g"
값이 인쇄됩니다 g
( date
뒤에 개행 문자가 표시됨). 왜냐하면 값이 g
명령의 첫 번째 인수로 전달되기 때문입니다. echo
run 인 경우 "$g"
문자열이 date
명령의 첫 번째 위치에 배치되므로 이것이 명령 이름이 됩니다.
그런 다음 $jj
두 번째 요소가 작용합니다. 변수 확장은 따옴표 밖에 있으므로"분할+글로브 연산자"이 값에 적용됩니다. 이 경우 이는 값이 jj
공백으로 구분된 두 단어로 분할됨을 의미합니다. 따라서 단어는 ping
명령 위치에서 끝나고 단어는 yahoo.com
첫 번째 인수입니다.
답변3
이는 예상된 동작이며 수년 동안 작동해 왔습니다. 스크립트에서 명령을 작성하는 데 유용합니다.
예를 들어, 특정 입력을 파이프로 보내기 전에 압축을 풀고 출력을 압축해야 하는 경우도 있지만 그렇지 않은 경우도 있습니다. 사용 bash
:
if (( use_compression == 1 )); then
infilter='gzip -d -c'
outfilter='gzip -c'
else
infilter='cat'
outfilter='cat'
fi
$infilter "$indatafile" | somepipeline | $outfilter >"$outdatafile"
명령 대체입니까? 아니요. "명령 대체"는 특히 $(...)
백틱 변형을 해당 출력으로 바꾸는 것을 의미합니다.
이것은 반대이다매개변수 확장, 이는 단순히 매개변수를 해당 값으로 대체합니다. 이는 명령이 실제로 실행되기 전에 발생하므로 작동하는 것입니다.
이는 다음과 같은 작업을 명령줄에서도 실행할 수 있음을 의미합니다.
$ decompress='gzip -d -c'
$ ${decompress/g/gun/} filename >unzippedfilename
( gunzip
대신 실행됩니다 gzip
)
편집하다:별칭 정보.
설명서에는 다음과 bash
같이 나와 있습니다.
거의 모든 목적에서 별칭은 쉘 함수로 대체됩니다.
...동의합니다.
별칭은 다음과 같은 짧은 콘텐츠에 적합합니다.
alias ls="ls -F"
(이것은 내 쉘 세션에 있는 유일한 별칭입니다.)
명령줄에서 "alias" 명령과 함께 매개변수 확장을 사용하고 싶지 않을 수도 있습니다. 다른 이유가 없다면 타이핑을 하면 목 통증이 발생할 수 있습니다. 매개변수 확장은 배관과 같이 조금 더 복잡한 작업도 허용하지 않습니다.
적당히 복잡한 작업을 정기적으로 수행하는 경우 대신 셸 기능을 사용하세요.
허용되는 답변을 예로 들어 보겠습니다.U&L 문제(아래 댓글에 링크를 걸어두었습니다):
alias my_File='ls -f | grep -v /'
이 별칭은 분명히 작동하지만
my_File='ls -f | grep -v /'
$my_File
그런 다음 이를 명령줄에서 명령으로 사용하려고 하면 작동하지 않습니다(이 U&L 스레드에 설명된 이유 때문에).
셸 함수를 사용하면 인수 전달과 같은 작업도 수행할 수 있습니다.
function my_File {
ls -l "$@" | fgrep -v '/'
}
$ my_File -iF symlink
84416642 lrwxr-xr-x 1 kk staff 4 Jun 27 09:03 symlink@ -> file
답변4
이는 수십 년 동안 (말 그대로) 주변에 있었고 이와 같이 작동한 개념인 쉘 변수를 사용합니다.
명령줄에 변수를 넣으면 쉘이 이를 대체한 다음 명령을 실행하므로 변수가 시작 부분에 있으면 분명히 명령으로 처리됩니다.