별칭 없이 변수에 명령 할당

별칭 없이 변수에 명령 할당

나는 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 사양지적

  1. 변수 할당이나 리디렉션이 아닌 단어는 확장되어야 합니다. 확장 후 남은 필드가 있는 경우 첫 번째 필드는 명령 이름으로 처리되어야 하며 나머지 필드는 명령에 대한 인수입니다.

이것간단한 명령 확장에 대한 Bash 매뉴얼 섹션도 지적했다

  1. 변수 할당이나 리디렉션이 아닌 단어는 확장됩니다(셸 확장 참조). 확장 후 남은 단어가 있는 경우 첫 번째 단어는 명령 이름으로 처리되고 나머지 단어는 인수로 처리됩니다.

답변2

이는 명령 대체가 아닙니다.바꾸다치환. 명령을 변수에 할당하는 대신 문자열을 할당합니다. 명령은 값이 할당될 때가 아니라 변수를 사용할 때 실행됩니다.

g=date문자열을 date변수에 저장합니다 g. 그런 다음 를 실행하면 echo "$g"값이 인쇄됩니다 g( date뒤에 개행 문자가 표시됨). 왜냐하면 값이 g명령의 첫 번째 인수로 전달되기 때문입니다. echorun 인 경우 "$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

이는 수십 년 동안 (말 그대로) 주변에 있었고 이와 같이 작동한 개념인 쉘 변수를 사용합니다.

명령줄에 변수를 넣으면 쉘이 이를 대체한 다음 명령을 실행하므로 변수가 시작 부분에 있으면 분명히 명령으로 처리됩니다.

관련 정보