Unix Shell 세상을 어떻게 보는지 (확장, 참조)
TL;박사
나는 매일 유닉스 터미널을 사용하고 수백 줄의 터미널 명령을 입력하지만, 때때로 내가 명령 뒤에 Enter 단추를 눌렀을 때, 나는 예상치 못한 행동을 만나게 된다.어떤 경우, 이것은 상당히 사람을 낙담하게 한다. 사실은 조개가 세상을 보는 방식이 나와 다르다는 것을 증명한다.나는 셸이 명령을 어떻게 조작하는지에 관한 서적을 읽었는데, 나는 이것이 정말 재미있다는 것을 발견하여, 오늘 여러분과 공유합니다.도움이 됐으면 좋겠어요.
간단하니까.echo 명령만 사용하면 Shell의 "마력"이라는 몇 가지 재미있는 특성을 확인할 수 있습니다.
확장
매번 우리가 명령 후에enter 키를 눌렀을 때, 그것은 실행하기 전에 엔진에 덮인 케이스로 변환됩니다.그것을 실현하는 과정은 호출 확장이다.확장이란 어떤 물건을 입력할 때, 셸이 그 물건에 작용하기 전에 다른 물건으로 확장되는 것을 말한다.예: * Shell에 큰 의미가 있습니다.이 점을 설명하기 위해서, 나는 echo 명령을 사용할 것입니다. 당신이 기억하는 바와 같이, echo는 간단한 셸 내장 함수입니다. 이것은 우리의 입력을 표준 출력으로 가리킵니다.
phuong@Arch ~$ echo Hello world
Hello world
따라서 * 와일드카드는 파일 이름의 모든 문자와 일치한다는 것을 의미합니다.셸에서 실행하기 전에 * 를 다른 문자로 바꾸면 echo 명령이 보이지 않습니다 *
phuong@Arch ~/kitchen$ echo *
bash device devops gateway go hook iuh js linux ml python
파일 이름 확장
사실상 이런 행위는 하나의 메커니즘에 의해 집행되는데 이런 메커니즘은 통상적으로 경로명 확장이라고 불린다.모두가 알다시피 파일 이름은 마침표로 시작됩니다 (예:.git) 는 숨겨져 있습니다.경로 이름 확장은 이 규칙을 따릅니다.확장자는 숨겨진 파일을 표시하지 않습니다.
phuong@Arch ~$ echo D*
Desktop Documents Downloads
그러나 다음 명령을 사용하여 숨겨진 모든 파일을 표시할 수 있습니다.
phuong@Arch ~$ echo .*
. .. .3T .ansible .anydesk .bash_history .bash_logout .bash_profile .bashrc .bashrc.backup .boto .cache .config .dbshell .designer .docker
산수 전개
산술 확장으로 인해 우리는 터미널 명령을 계산기로 사용할 수 있지만, 이것은 간단한 정수에만 적용된다.비록 그것은 한계가 있지만, 어떤 경우에는 유용할 수도 있고, 또한 많은 유행하는 연산자를 지원한다.예를 들면,,-,*,%,/,+,...
산술 확장은 다음 모드를 따릅니다.
$(표현식)
phuong@Arch ~$ echo This month has $((4*7)) days
This month has 28 days
중괄호 대신 중괄호 중첩자를 사용하여 확장할 수도 있습니다.예:
phuong@Arch ~$ echo This year has $((((4*7)*12) + $((3 * 9)))) days
This year has 363 days
파도형 전개
터미널에서 ~를 문자열의 시작으로 사용하면 사용자의 홈 디렉터리로 확장됩니다.
예를 들어 나는 클라우드에서 계정을 사용한다. 그곳에는 많은 사용자가 있다. 나는 그들의 메인 디렉터리가 어디에 있는지 모른다. 나는 그들의 사용자 이름만 안다.이것이 바로 그것이 역할을 발휘하는 곳이다
phuong@devcloud1:~$ echo ~wingzero
/home/wingzero
phuong@devcloud1:~$ echo ~phuong
/home/phuong
스탠드 확장
괄호 표현식 자체는 쉼표로 구분된 문자열 목록을 포함할 수도 있고, 일련의 정수나 단일 문자를 포함할 수도 있다.
쉼표 구분의 예:
phuong@Arch ~/kitchen/ips$ echo A{A,B}
AA AB
동일, 단일 문자의 범위
phuong@Arch ~$ echo {A..Z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
내가 보기에 이런 확장은 가장 재미있는 확장 메커니즘 중의 하나이다. 왜냐하면 그것은 특정한 상황에서 매우 유용하기 때문이다.만약 내가 서브넷 범위 내의 각 네트워크 IP에 대해 각 폴더를 만들고 싶다면.192.168.43.1->192.168.43.13으로 가장하다.그래서 나는 내가 한 번에 4개월을 하는 방식을 인정한다. mkdir...그러나 이런 방법은 타자 오류가 발생하기 쉽다.이것이 바로 브래킷 확장의 출처와 저장이다.
phuong@Arch ~/kitchen/ips$ mkdir 192.168.43.{1..13}
phuong@Arch ~/kitchen/ips$ ls
192.168.43.1 192.168.43.12 192.168.43.3 192.168.43.6 192.168.43.9
192.168.43.10 192.168.43.13 192.168.43.4 192.168.43.7
192.168.43.11 192.168.43.2 192.168.43.5 192.168.43.8
보시다시피 괄호 확장도 중첩할 수 있습니다.
phuong@Arch ~/kitchen/ips$ echo A{a{1,2},b{9,10}}
Aa1 Aa2 Ab9 Ab10
명령 바꾸기
상술한 확장 메커니즘을 제외하고 명령 교체는 스크립트에서 광범위하게 사용되기 때문에 익숙할 수 있습니다.명령 바꾸기를 사용하면 명령의 출력을 확장으로 사용할 수 있습니다.예:
phuong@Arch ~/kitchen$ ls -l $(which go)
lrwxrwxrwx 1 root root 18 Nov 2 17:25 /usr/bin/go -> /usr/lib/go/bin/go
이것은 또 다른 예이다
phuong@Arch ~$ echo Hello $(w=world; echo $w)
Hello world
매개변수 대체
명령줄에서 직접 사용하는 것보다 스크립트에서 많이 사용됩니다.예를 들어, 사용자 변수를 인쇄하려면 처음에 달러 기호($)를 추가하면 됩니다.
phuong@Arch ~$ echo $USER
phuong
변수의 이름을 잘못 입력하면 확장이 발생하지만 빈 문자열을 만들 수 있습니다.
간단하게 보기 위해서 나는 상세하게 소개하지 않을 것이다.이 강력한 메커니즘은 다른 직위를 얻어야 하기 때문이다.이 글의 범위는 유행하는 확장 메커니즘과 그것을 어떻게 통제하는지를 지적하는 것이다.
인용하다
그래서 우리는 케이스의 확장이 얼마나 강한지 보았다. 이것이 바로 우리가 그것을 어떻게 통제하는지 알지 않는 한 예상치 못한 행동을 초래할 수 있는 이유이다.
이제 재미있는 부분을 봅시다.
다음 두 가지 예를 고려하십시오.
예 1:
phuong@Arch ~$ echo Hello I am a string
Hello I am a string
예 2:
phuong@Arch ~$ echo It costs me $200
It costs me 00
익숙한데?
첫 번째 예시에서, 분사는 echo 명령의 매개 변수 목록에서 추가 빈칸을 제거합니다.두 번째 예에서 매개 변수 확장 메커니즘을 통해 $2를 확장했다. 즉, 문제는 $2 변수가 정의되지 않았기 때문에 케이스가 의외의 확장을 억제하고 결국 그 행동을 초래할 수 있다는 것이다.우리 이 문제를 어떻게 해결해야 할지 생각해 봅시다.
큰따옴표
이중 따옴표에 특수 문자를 넣으면 셸에 대한 특별한 의미는 사라지지만, 달러 기호, 백슬래시, 백슬래시 등 세 가지 예외가 있습니다.
이것은 특정 장면에서 매우 유용하다.내 뜻을 보여주기 위해 당신의 한 친구가 당신에게'숙제part1.doc'라는 숙제 파일을 보냈다고 상상해 보세요.응, 그건 너를 미치게 할 수도 있어.
이것은 아래의 상황을 초래했다
phuong@Arch ~/Downloads$ cat homework part1.doc
cat: homework: No such file or directory
cat: part1.doc: No such file or directory
쌍인용호가 너를 구하러 왔다.
phuong@Arch ~/Downloads$ mv "homework part1.doc" homework_part1.doc
phuong@Arch ~/Downloads$ cat homework_part1.doc
This is my stupid homework part, now is your turn
큰따옴표를 추가한 후, 우리의 명령은 명령과 파라미터를 포함합니다.이것이 바로 우리가 추가 공백을 유지하는 방식이다. 왜냐하면 위에서 언급한 세계 분할은 여러 개의 매개 변수에만 유효하기 때문이다.모든 내용을 더블 인용부호로 묶었는데, 그 행위는 echo 명령 뒤에 매개 변수만 있는 것과 같다
phuong@Arch ~/Downloads$ echo Hello I am a string
Hello I am a string
phuong@Arch ~/Downloads$ echo "Hello I am a string"
Hello I am a string
큰따옴표
모든 특수 문자만 억제하려면 따옴표를 사용해야 한다
phuong@Arch ~/Downloads$ echo 'cat ~/Download/.doc {a,b} $(echo bar) $((3+2)) $USER'
cat ~/Download/.doc {a,b} $(echo bar) $((3+2)) $USER
이스케이프 문자
때때로 우리는 단지 하나의 문자를 인용하고 싶을 뿐, 이 점을 하기 위해서 이 문자 앞에 백슬래시를 추가합니다\
phuong@Arch ~/Downloads$ echo "You own me $30"
You own me 0
phuong@Arch ~/Downloads$ echo "You own me \$30"
You own me $30
파일 이름의 확장을 선택적으로 막을 수 있습니다.
결론
한마디로 유닉스 셸의 확장 메커니즘은 매우 강하다.만약 우리가 그것을 어떻게 통제하는지 알고 있다면, 나는 이러한 기능들이 반드시 당신의 생산력을 향상시킬 것이라고 믿는다.만약 당신에게 무슨 문제가 있으면 언제든지 아래에 평론을 발표해 주십시오. 당신의 편지를 받게 되어 매우 기쁩니다.
시간 내주셔서 감사합니다.
공구서류
매번 우리가 명령 후에enter 키를 눌렀을 때, 그것은 실행하기 전에 엔진에 덮인 케이스로 변환됩니다.그것을 실현하는 과정은 호출 확장이다.확장이란 어떤 물건을 입력할 때, 셸이 그 물건에 작용하기 전에 다른 물건으로 확장되는 것을 말한다.예: * Shell에 큰 의미가 있습니다.이 점을 설명하기 위해서, 나는 echo 명령을 사용할 것입니다. 당신이 기억하는 바와 같이, echo는 간단한 셸 내장 함수입니다. 이것은 우리의 입력을 표준 출력으로 가리킵니다.
phuong@Arch ~$ echo Hello world
Hello world
따라서 * 와일드카드는 파일 이름의 모든 문자와 일치한다는 것을 의미합니다.셸에서 실행하기 전에 * 를 다른 문자로 바꾸면 echo 명령이 보이지 않습니다 *phuong@Arch ~/kitchen$ echo *
bash device devops gateway go hook iuh js linux ml python
파일 이름 확장
사실상 이런 행위는 하나의 메커니즘에 의해 집행되는데 이런 메커니즘은 통상적으로 경로명 확장이라고 불린다.모두가 알다시피 파일 이름은 마침표로 시작됩니다 (예:.git) 는 숨겨져 있습니다.경로 이름 확장은 이 규칙을 따릅니다.확장자는 숨겨진 파일을 표시하지 않습니다.
phuong@Arch ~$ echo D*
Desktop Documents Downloads
그러나 다음 명령을 사용하여 숨겨진 모든 파일을 표시할 수 있습니다.phuong@Arch ~$ echo .*
. .. .3T .ansible .anydesk .bash_history .bash_logout .bash_profile .bashrc .bashrc.backup .boto .cache .config .dbshell .designer .docker
산수 전개
산술 확장으로 인해 우리는 터미널 명령을 계산기로 사용할 수 있지만, 이것은 간단한 정수에만 적용된다.비록 그것은 한계가 있지만, 어떤 경우에는 유용할 수도 있고, 또한 많은 유행하는 연산자를 지원한다.예를 들면,,-,*,%,/,+,...
산술 확장은 다음 모드를 따릅니다.
$(표현식)
phuong@Arch ~$ echo This month has $((4*7)) days
This month has 28 days
중괄호 대신 중괄호 중첩자를 사용하여 확장할 수도 있습니다.예:phuong@Arch ~$ echo This year has $((((4*7)*12) + $((3 * 9)))) days
This year has 363 days
파도형 전개
터미널에서 ~를 문자열의 시작으로 사용하면 사용자의 홈 디렉터리로 확장됩니다.
예를 들어 나는 클라우드에서 계정을 사용한다. 그곳에는 많은 사용자가 있다. 나는 그들의 메인 디렉터리가 어디에 있는지 모른다. 나는 그들의 사용자 이름만 안다.이것이 바로 그것이 역할을 발휘하는 곳이다
phuong@devcloud1:~$ echo ~wingzero
/home/wingzero
phuong@devcloud1:~$ echo ~phuong
/home/phuong
스탠드 확장
괄호 표현식 자체는 쉼표로 구분된 문자열 목록을 포함할 수도 있고, 일련의 정수나 단일 문자를 포함할 수도 있다.
쉼표 구분의 예:
phuong@Arch ~/kitchen/ips$ echo A{A,B}
AA AB
동일, 단일 문자의 범위phuong@Arch ~$ echo {A..Z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
내가 보기에 이런 확장은 가장 재미있는 확장 메커니즘 중의 하나이다. 왜냐하면 그것은 특정한 상황에서 매우 유용하기 때문이다.만약 내가 서브넷 범위 내의 각 네트워크 IP에 대해 각 폴더를 만들고 싶다면.192.168.43.1->192.168.43.13으로 가장하다.그래서 나는 내가 한 번에 4개월을 하는 방식을 인정한다. mkdir...그러나 이런 방법은 타자 오류가 발생하기 쉽다.이것이 바로 브래킷 확장의 출처와 저장이다.phuong@Arch ~/kitchen/ips$ mkdir 192.168.43.{1..13}
phuong@Arch ~/kitchen/ips$ ls
192.168.43.1 192.168.43.12 192.168.43.3 192.168.43.6 192.168.43.9
192.168.43.10 192.168.43.13 192.168.43.4 192.168.43.7
192.168.43.11 192.168.43.2 192.168.43.5 192.168.43.8
보시다시피 괄호 확장도 중첩할 수 있습니다.phuong@Arch ~/kitchen/ips$ echo A{a{1,2},b{9,10}}
Aa1 Aa2 Ab9 Ab10
명령 바꾸기
상술한 확장 메커니즘을 제외하고 명령 교체는 스크립트에서 광범위하게 사용되기 때문에 익숙할 수 있습니다.명령 바꾸기를 사용하면 명령의 출력을 확장으로 사용할 수 있습니다.예:
phuong@Arch ~/kitchen$ ls -l $(which go)
lrwxrwxrwx 1 root root 18 Nov 2 17:25 /usr/bin/go -> /usr/lib/go/bin/go
이것은 또 다른 예이다phuong@Arch ~$ echo Hello $(w=world; echo $w)
Hello world
매개변수 대체
명령줄에서 직접 사용하는 것보다 스크립트에서 많이 사용됩니다.예를 들어, 사용자 변수를 인쇄하려면 처음에 달러 기호($)를 추가하면 됩니다.
phuong@Arch ~$ echo $USER
phuong
변수의 이름을 잘못 입력하면 확장이 발생하지만 빈 문자열을 만들 수 있습니다.간단하게 보기 위해서 나는 상세하게 소개하지 않을 것이다.이 강력한 메커니즘은 다른 직위를 얻어야 하기 때문이다.이 글의 범위는 유행하는 확장 메커니즘과 그것을 어떻게 통제하는지를 지적하는 것이다.
인용하다
그래서 우리는 케이스의 확장이 얼마나 강한지 보았다. 이것이 바로 우리가 그것을 어떻게 통제하는지 알지 않는 한 예상치 못한 행동을 초래할 수 있는 이유이다.
이제 재미있는 부분을 봅시다.
다음 두 가지 예를 고려하십시오.
예 1:
phuong@Arch ~$ echo Hello I am a string
Hello I am a string
예 2:
phuong@Arch ~$ echo It costs me $200
It costs me 00
익숙한데?
첫 번째 예시에서, 분사는 echo 명령의 매개 변수 목록에서 추가 빈칸을 제거합니다.두 번째 예에서 매개 변수 확장 메커니즘을 통해 $2를 확장했다. 즉, 문제는 $2 변수가 정의되지 않았기 때문에 케이스가 의외의 확장을 억제하고 결국 그 행동을 초래할 수 있다는 것이다.우리 이 문제를 어떻게 해결해야 할지 생각해 봅시다.
큰따옴표
이중 따옴표에 특수 문자를 넣으면 셸에 대한 특별한 의미는 사라지지만, 달러 기호, 백슬래시, 백슬래시 등 세 가지 예외가 있습니다.
이것은 특정 장면에서 매우 유용하다.내 뜻을 보여주기 위해 당신의 한 친구가 당신에게'숙제part1.doc'라는 숙제 파일을 보냈다고 상상해 보세요.응, 그건 너를 미치게 할 수도 있어.
이것은 아래의 상황을 초래했다
phuong@Arch ~/Downloads$ cat homework part1.doc
cat: homework: No such file or directory
cat: part1.doc: No such file or directory
쌍인용호가 너를 구하러 왔다.
phuong@Arch ~/Downloads$ mv "homework part1.doc" homework_part1.doc
phuong@Arch ~/Downloads$ cat homework_part1.doc
This is my stupid homework part, now is your turn
큰따옴표를 추가한 후, 우리의 명령은 명령과 파라미터를 포함합니다.이것이 바로 우리가 추가 공백을 유지하는 방식이다. 왜냐하면 위에서 언급한 세계 분할은 여러 개의 매개 변수에만 유효하기 때문이다.모든 내용을 더블 인용부호로 묶었는데, 그 행위는 echo 명령 뒤에 매개 변수만 있는 것과 같다
phuong@Arch ~/Downloads$ echo Hello I am a string
Hello I am a string
phuong@Arch ~/Downloads$ echo "Hello I am a string"
Hello I am a string
큰따옴표
모든 특수 문자만 억제하려면 따옴표를 사용해야 한다
phuong@Arch ~/Downloads$ echo 'cat ~/Download/.doc {a,b} $(echo bar) $((3+2)) $USER'
cat ~/Download/.doc {a,b} $(echo bar) $((3+2)) $USER
이스케이프 문자
때때로 우리는 단지 하나의 문자를 인용하고 싶을 뿐, 이 점을 하기 위해서 이 문자 앞에 백슬래시를 추가합니다\
phuong@Arch ~/Downloads$ echo "You own me $30"
You own me 0
phuong@Arch ~/Downloads$ echo "You own me \$30"
You own me $30
파일 이름의 확장을 선택적으로 막을 수 있습니다.
결론
한마디로 유닉스 셸의 확장 메커니즘은 매우 강하다.만약 우리가 그것을 어떻게 통제하는지 알고 있다면, 나는 이러한 기능들이 반드시 당신의 생산력을 향상시킬 것이라고 믿는다.만약 당신에게 무슨 문제가 있으면 언제든지 아래에 평론을 발표해 주십시오. 당신의 편지를 받게 되어 매우 기쁩니다.
시간 내주셔서 감사합니다.
공구서류
phuong@Arch ~$ echo Hello I am a string
Hello I am a string
phuong@Arch ~$ echo It costs me $200
It costs me 00
phuong@Arch ~/Downloads$ cat homework part1.doc
cat: homework: No such file or directory
cat: part1.doc: No such file or directory
phuong@Arch ~/Downloads$ mv "homework part1.doc" homework_part1.doc
phuong@Arch ~/Downloads$ cat homework_part1.doc
This is my stupid homework part, now is your turn
phuong@Arch ~/Downloads$ echo Hello I am a string
Hello I am a string
phuong@Arch ~/Downloads$ echo "Hello I am a string"
Hello I am a string
phuong@Arch ~/Downloads$ echo 'cat ~/Download/.doc {a,b} $(echo bar) $((3+2)) $USER'
cat ~/Download/.doc {a,b} $(echo bar) $((3+2)) $USER
phuong@Arch ~/Downloads$ echo "You own me $30"
You own me 0
phuong@Arch ~/Downloads$ echo "You own me \$30"
You own me $30
한마디로 유닉스 셸의 확장 메커니즘은 매우 강하다.만약 우리가 그것을 어떻게 통제하는지 알고 있다면, 나는 이러한 기능들이 반드시 당신의 생산력을 향상시킬 것이라고 믿는다.만약 당신에게 무슨 문제가 있으면 언제든지 아래에 평론을 발표해 주십시오. 당신의 편지를 받게 되어 매우 기쁩니다.
시간 내주셔서 감사합니다.
공구서류
Reference
이 문제에 관하여(Unix Shell 세상을 어떻게 보는지 (확장, 참조)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/phuonghau98/how-the-unix-shell-sees-the-world-expansion-quoting-42ng텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)