Bash를 사용하여 가장 좋아하는 명령 행 트릭은 무엇입니까?



14 Answers

cd -

이것은 뒤로 버튼과 동일한 명령 행입니다 (이전 디렉토리로 이동합니다).

Question

우리는 <ctrl>-R 을 사용하여 역사를 통해 검색을 역전시키는 방법을 알고 있지만 stty stop "" 을 설정하면 <ctrl>-S 를 사용하여 검색을 전달할 수 있다는 것을 알고 있습니까? 또한 키보드 단축키 목록이 모두 표시되도록 bind -p를 실행 해 본 적이 있습니까? Mac OS X에는 기본적으로 455 이상이 있습니다.

bash를 사용하여 가장 좋아하는 애매한 트릭, 키보드 단축키 또는 shopt 구성은 무엇입니까?




내가 가장 좋아하는 것은 '^ string ^ string2'이다. 마지막 명령을 사용하고 string2를 string2로 바꾸고 실행한다.

$ ehco foo bar baz
bash: ehco: command not found
$ ^ehco^echo
foo bar baz

Bash 명령 행 이력 가이드




나는 가장 최근 제출 된 명령 줄에서 마지막 항목, 첫 번째 비 명령 항목 및 모든 비 명령 항목을 반환하는 !$ ,! !^!* expandos의 팬입니다. 지혜를 원한다. (쉘이 명령을 먼저 출력한다.)

$ echo foo bar baz
foo bar baz
$ echo bang-dollar: !$ bang-hat: !^ bang-star: !*
echo bang-dollar: baz bang-hat: foo bang-star: foo bar baz
bang-dollar: baz bang-hat: foo bang-star: foo bar baz

이것은 ls filea fileb 라고하면 vi !$ 또는 둘 다 : vimdiff !* 중 하나를 편집하려고 할 때 편리합니다. 또한 다음과 같이 " n 번째 인수"로 일반화 할 수 있습니다.

$ echo foo bar baz
$ echo !:2
echo bar
bar

마지막으로 경로 이름을 사용하면 위의 확장에 :h:t 를 추가하여 경로의 일부를 얻을 수 있습니다.

$ ls /usr/bin/id
/usr/bin/id
$ echo Head: !$:h  Tail: !$:t
echo Head: /usr/bin Tail: id
Head: /usr/bin Tail: id



명령 행에서 'set -o vi'를 사용하거나 더 나은 .bashrc를 사용하면 명령 행에서 vi 편집 모드로 전환됩니다. '삽입'모드에서 시작하여 평소대로 입력하고 백 스페이스 할 수 있지만 '큰'실수를하면 esc 키를 치고 vi에서와 같이 'b'와 'f'를 사용하여 이동할 수 있습니다. cw를 눌러 단어를 변경하십시오. 변경하려는 기록 명령을 가져온 후에 특히 유용합니다.




현재 디렉토리에 하위 디렉토리 나열하는 방법?

ls -d */

그것은 간단한 속임수이지만, 당신은 내가 그것을 발견하는데 얼마나 많은 시간을 필요로했는지 알지 못할 것입니다!




pbcopy

이렇게하면 Mac 시스템 클립 보드로 복사됩니다. 명령을 파이프 할 수 있습니다 ... 시도해보십시오.

pwd | pbcopy




다른 명령과 함께 watch 명령을 사용하여 변경 사항을 찾을 수 있습니다. 이 예제는 라우터를 테스트 할 때 발생했으며 신호 대 잡음비 등의 최신 수치를 얻고 싶었습니다.

watch --interval=10 lynx -dump http://dslrouter/stats.html



나는 종종 vi, ls 등의 별칭을 가지고 있지만 때로는 별칭을 벗어나기를 원합니다. 그냥 명령 앞에 백 슬래시를 추가하십시오.

예 :

$ alias vi=vim
$ # To escape the alias for vi:
$ \vi # This doesn't open VIM

멋지지 않습니까?




나는 다음을 많이 사용한다.

히스토리 결과를 출력하는 :p 수정 자. 예 :

!!:p

마지막 명령을 인쇄하여 다시 실행하기 전에 올바른지 확인할 수 있습니다. 그냥 입력하십시오 !! 그것을 실행합니다.

비슷한 맥락에서 :

!?foo?:p

'foo'문자열이 포함 된 최신 명령에 대한 기록을 검색하여 인쇄합니다.

인쇄 할 필요가없는 경우,

!?foo

검색을 수행하고 바로 실행합니다.




echo로 명령을 만들고 쉘에 파이프하는 것을 좋아합니다 :

$ find dir -name \*~ | xargs echo rm
...
$ find dir -name \*~ | xargs echo rm | ksh -s

왜? 왜냐하면 내가 그것을하기 전에 무엇을 할 것인지를 볼 수 있기 때문입니다. 그렇게하면 끔찍한 실수 (예 : 홈 디렉토리 삭제)가 발생하기 전에이를 잡을 수 있습니다. 분명히 이것은 파괴적이고 돌이킬 수없는 행동에 가장 중요합니다.




참신한면이 많지만 똑똑 하네.

사용 된 상위 10 개 명령 :

$ history | awk '{print $2}' | awk 'BEGIN {FS="|"}{print $1}' | sort | uniq -c | sort -nr | head

샘플 출력 :

 242 git
  83 rake
  43 cd
  33 ss
  24 ls
  15 rsg
  11 cap
  10 dig
   9 ping
   3 vi



무시 무시한 입력을 치기 전에 복잡한 라인을 확장하십시오.

  • Alt + Ctrl + e - shell-expand-line (키보드에서 Esc , Ctrl + e 를 사용해야 할 수도 있음)
  • Ctrl + _ - 실행 취소
  • Ctrl + x , * - glob-expand-word

$ echo !$ !-2^ * Alt + Ctrl + e
$ echo aword someotherword * Ctrl + _
$ echo !$ !-2^ * Ctrl + x , *
$ echo !$ !-2^ LOG Makefile bar.c foo.h

&기음.




pushdpopd 는 항상 항상 유용합니다.




&& 명령을 사용하여 여러 명령을 문자열로 묶기 :

./run.sh && tail -f log.txt

또는

kill -9 1111 && ./start.sh



물론, 당신은 " diff file1.txt file2.txt "일 수 있지만, Bash는 명령의 출력을 달리 할 수있는 프로세스 대체를 지원합니다.

예를 들어, 제 스크립트가 예상 한 결과를 제공하는지 확인하려고한다고 가정 해 봅시다. <()에서 스크립트를 랩핑하고 diff 에 피드를 diff 빠르고 간단한 단위 테스트를 얻을 수 있습니다.

$ cat myscript.sh
#!/bin/sh
echo -e "one\nthree"
$
$ ./myscript.sh 
one
three
$
$ cat expected_output.txt
one
two
three
$
$ diff <(./myscript.sh) expected_output.txt
1a2
> two
$

또 다른 예로, 두 대의 서버에 동일한 RPM 목록이 설치되어 있는지 확인하고 싶습니다. 각 서버를 sshing하는 대신 RPM의 각 목록을 파일을 분리하여 작성하고 해당 파일을 diff 하면 내 워크 스테이션에서 diff 를 수행 할 수 있습니다.

$ diff <(ssh server1 'rpm -qa | sort') <(ssh server2 'rpm -qa | sort')
241c240
< kernel-2.6.18-92.1.6.el5
---
> kernel-2.6.18-92.el5
317d315
< libsmi-0.4.5-2.el5
727,728d724
< wireshark-0.99.7-1.el5
< wireshark-gnome-0.99.7-1.el5
$

Advanced Bash 스크립팅 가이드 ( http://tldp.org/LDP/abs/html/process-sub.html 더 많은 예제가 있습니다.



Related