Bash를 사용하는 가장 좋아하는 명령 줄 트릭은 무엇입니까? [닫은]


156

우리는 모두 <ctrl>-R히스토리를 통해 검색을 되 돌리는 방법을 알고 있지만 <ctrl>-S설정하면 검색을 전달 하는 데 사용할 수 있다는 것을 알고 stty stop ""있습니까? 또한 bind -p를 실행하여 모든 키보드 단축키를 나열한 적이 있습니까? Mac OS X에는 기본적으로 455 개가 넘습니다.

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


2
"당신이 가장 좋아하는 것은 무엇입니까?"라고 말하십시오. 이를 통해 사람들은 설문 조사와 같은 특정 답변을 투표 할 수 있습니다.
— SCdF

> "가장 좋아하는 것은 무엇입니까?" 끝난.
— Martin Klinke

1
이 질문에 대한 StackOverflow 클론이 있습니다 : commandlinefu.com
— rkb

455 개의 기본 키 바인딩 중 232 개만 "self-insert"( "이 키 입력") 이외의 작업을 수행합니다. $ bind -p | grep -v self-insert | 화장실
— 에드 Brannin

여기에 깔끔한 것들이 있습니다. 그러나 bash가 emacs 모드 일 때만 그들 중 상당수가 작동한다는 점에 주목해야한다.
— Mo.

답변:


157

접미사가있는 파일 이름 바꾸기 / 이동 :
cp /home/foo/realllylongname.cpp{,-old}

이것은 다음과 같이 확장됩니다.
cp /home/foo/realllylongname.cpp /home/foo/realllylongname.cpp-old


12
대박! 이제 이것을 기억하고 기억해야합니다.
— Jon Ericson

9
역순으로 (.cpp-old에서 .cpp로 이동) cp /home/foo/realllylongname.cpp{-old,}
— Michael Ekoka

돌이켜 보면 분명하지만, 나는 내 스스로 그렇게하는 것을 기억하지 않는다. 감사!
— Zecc

150
cd -

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


6
나는 디렉토리 스택 을 사용 pushd하고 popd유지하는 것을 선호한다 .
— Alex M

21
그러나 'cd-'는 푸시를 사용하는 것을 기억하지 않아도 작동하는 이점이 있습니다.
— Sergio Acosta

10
'cd'를 사용하면 홈 디렉토리로 이동합니다.
— dr-jan

그것은이에 표시되지 않는 흥미 man cd, 또는 cd --help(적어도 내에서).
— Halil Özgür

135

또 다른 마음에 드는 것 :

!!

마지막 명령을 반복합니다. 다음과 같은 형태로 가장 유용합니다.

sudo !!

81
그것은 또한 당신이 그것에 대해 정말로 화를 내도록하는 추가적인 이점을 가지고 있습니다. "컴퓨터, 이거 해봐." "접근 불가". "해!!"
— nickf September

그다지 알려지지 않았습니다! :-)
— hoyhoy

10
당신이 할 수있는 비슷한 일 : mkdir testdir; cd !$.. 이것은 실행됩니다 cd [last word of previous line](예제에서 cd testdir)
— dbr

13
샌드위치 샌드위치 만들기 !!
— 키비

!!,! $ 및! -1 : ^ foo ^ bar가 마음에 들면 "Space : magic-space"도 바인딩됩니다. stackoverflow.com/questions/603696/…
— Yoo

81

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

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

배쉬 커맨드 라인 히스토리 가이드


욕심이 없습니다. 탐욕스럽게 만들려면 어떻게해야합니까?
— Altreus

9
!!:gs/ehco/echo/
— andre-r

이 가이드의 두 번째 페이지는 필수적입니다
— jmoz

1
@ 앙드레-R : !!:gs/ehco/echo/수행 (협의의 마지막 명령에 대한 글로벌 검색 및 교체 !!에 stackoverflow.com/questions/68372/... ). 이는 ^ehco^echo"ehco"의 한 인스턴스를 대체하는 것과 같지 않습니다 .보다 정확한 응답은 다음과 같습니다 !!:s/ehco/scho.
— Iceland_jack

64

이름을 바꾸다

예:

$ ls
this_has_text_to_find_1.txt
this_has_text_to_find_2.txt
this_has_text_to_find_3.txt
this_has_text_to_find_4.txt

$ rename 's/text_to_find/been_renamed/' *.txt
$ ls
this_has_been_renamed_1.txt
this_has_been_renamed_2.txt
this_has_been_renamed_3.txt
this_has_been_renamed_4.txt

매우 유용합니다


3
와우, 나는 기본 이름, mv 및 {} 트릭을 사용하여 지난 몇 년 동안 바보가되었습니다. / foreheadsmack.
— Gregg Lind

7
그러나 rename은 다른 게시물과 마찬가지로 배쉬 / 읽기 전용이 아닙니다.
— 총

1
대부분의 경우 zsh 배포의 zmv가 훨씬 좋습니다.
— ZyX

util-linux-ng 는 또한 rename 명령을 가지고 있으며이 답변에서 언급 한 것과 다릅니다. 여기에 설명 된 명령은 실제로 mmv 입니다.
— Cristian Ciupitu

60

나는 가장 최근에 제출 된 명령 줄에서 마지막 항목, 첫 번째 비 명령 항목 및 모든 비 명령 항목에서 돌아 오는 !$, !^및 !*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과 같이 "th argument" 로 일반화 할 수도 있습니다 .

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

마지막으로, 경로 이름, 당신은 추가하여 경로의 일부에서 얻을 수 있습니다 :h및 :t위 expandos 중 하나에 :

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

'에코! 2'했던 내가 있어야 할 것 같아요 저 및 나중에 포스트 I 톱에서없는 일 '에코 2!'
— user13060

8
"bind Space : magic-space"를 .bashrc에 추가하십시오! 스페이스를 치면 조합이 자동으로 확장됩니다.
— Yoo

47

명령을 실행할 때 때로는 이전 인수로 명령을 실행하고 싶을 때가 있습니다. 이를 위해 다음 단축키를 사용할 수 있습니다.

$ mkdir /tmp/new
$ cd !!:*

때로는 find를 사용하는 대신 파일 목록에서 여러 명령을 실행 해야하는 경우 한 줄 루프를 분리합니다.

for file in *.wav; do lame "$file" "$(basename "$file" .wav).mp3" ; done;

내 .bash_login (또는 .bashrc)에서 명령 줄 기록 옵션을 구성하면 정말 유용합니다. 다음은 Macbook Pro에서 사용하는 설정입니다.

다음을 설정하면 bash가 히스토리에서 중복 명령을 삭제합니다.

export HISTCONTROL="erasedups:ignoreboth"

또한 내 역사 크기도 꽤 높게 올렸습니다. 왜 안돼? 오늘날의 마이크로 프로세서에서는 속도가 느려지지 않는 것 같습니다.

export HISTFILESIZE=500000
export HISTSIZE=100000

내가하는 또 다른 일은 내 역사에서 일부 명령을 무시하는 것입니다. exit 명령을 기억할 필요가 없습니다.

export HISTIGNORE="&:[ ]*:exit"

당신은 확실히 histappend를 설정하고 싶습니다. 그렇지 않으면 bash는 종료 할 때 기록을 덮어 씁니다.

shopt -s histappend

내가 사용하는 또 다른 옵션은 cmdhist입니다. 이를 통해 여러 줄 명령을 하나의 명령으로 기록에 저장할 수 있습니다.

shopt -s cmdhist

마지막으로, Mac OS X (vi 모드를 사용하지 않는 경우)에서는 <CTRL> -S를 스크롤 중지 상태로 재설정해야합니다. 이것은 bash가 정방향 검색으로 해석 할 수 없게합니다.

stty stop ""

6
"Alt-"를 찾습니다. 마지막 명령의 마지막 단어를 반복하기 위해 "!! : *"보다 훨씬 낫습니다.
— Weidenrinde

histroy에 대한 추가 사항 : 1. 히스토리를 정기적으로 저장하십시오 (한 번에 여러 쉘을 연 경우 -a를 사용하여). export PROMPT_COMMAND = "history -a"2. 다른 쉘에서 히스토리를 읽기위한 별명. 별명-h = 'history -n; 역사 | grep '
— Weidenrinde

수출 HISTIGNORE = "[] *"는 동일해야 귀하의 HISTCONTROL = ignoreboth으로 필요하지 않습니다
— Weidenrinde

히스토리에 대한 또 다른 좋은 것은 : 반출 HISTTIMEFORMAT = "% Y- % M- % D %가 H %의 M %는 S :"
— Weidenrinde

"cd !! : *"에서 몇 번의 키 입력을 저장하려면 "cd! $"를 시도하십시오. "! $"는 마지막 명령의 마지막 인수로 해석됩니다.
— Tim Stewart

43

현재 하나의 하위 디렉토리 만 나열하는 방법은 무엇입니까?

ls -d */

그것은 간단한 트릭이지만, 그 것을 찾는 데 얼마나 많은 시간이 필요한지 알 수 없습니다!


2
우수한! 지난 몇 년 동안 내가 alias lsd='ls -F | grep --color /'겪을 수있는 최선은이었다 . 그러나 쉽게 구문 분석 할 수 있도록 한 줄에 하나의 디렉토리를 나열합니다. 동일한 작업을 수행하도록 명령을 수정했습니다.ls -d1 */
— Artem Russakovskii

어떻게 작동합니까? "ls -d"는 그냥 나열합니다. (이상한) "ls -d * /"작동합니다.
— Yoo

1
조금 까다 롭습니다 ... "ls -d"는 "ls -d ./"와 "ls -d /"와 "ls -d ./*/"와 비슷합니다. '-d'스위치 세트 'ls'tu는 디렉토리 항목 만 나열하지만 매개 변수를 제공하지 않으면 현재 디렉토리를 매개 변수로 사용하므로 " * " 만 있습니다. 디렉토리 목록 ...
— edomaur

1
나는 이것을 전에 발견 한 적이 없다고 믿을 수 없다. 좋은 팁.
— Nick Dixon

아무 말도 안 돼! :)
— dimba

41

ESC.

마지막 bash 명령에서 마지막 인수를 삽입합니다. 생각보다 편리합니다.

cp file /to/some/long/path

CD ESC.


이것은 나를 위해 작동합니다 (bash). esc 키를 누른 다음 마침표 키를 누르십시오. 하이픈이나 아무것도 없습니다.
— Howler

9
또한 alt-. 같은 것입니다.
— Mark Baker

네, 배쉬 만입니다. 그러나 <esc> (또는 Alt- 또는 Meta-) _는 동일한 함수에 바인딩되어 있으며 <esc> -_도 vi 모드에서 작동합니다.
— Nick Dixon

내 zsh에서 @hendry 실제로 작동합니다. 아마도 당신은 vi 모드를 사용합니까?
— ZyX

키보드 적중에 kbd-tag를 사용하십시오 : <kbd> ESC </ kbd> (하지만 코드 형식화 / 들여 쓰기와 함께 잘 작동하지는 않습니다).
— 사용자가 알 수 없음

36

물론, 당신은 "수 diff file1.txt file2.txt"있지만, 배쉬 지원 프로세스 대체 당신을 허용, 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
$

http://tldp.org/LDP/abs/html/process-sub.html 의 Advanced Bash-Scripting Guide에 더 많은 예제가 있습니다 .


35

내가 가장 좋아하는 명령은 "ls -thor"입니다

신의 힘을 소환하여 가장 최근에 수정 한 파일을 읽기 쉬운 형식으로 나열합니다.


6
전혀 쓸모가 없지만 재미있는 명령을 상기 ls -bart -simpson -ruls시킵니다. S, ICNR
— filiprem

큰 파일을 빨리 찾을 수 있기 때문에 'ls -tor'도 유용합니다. 또한 천둥 신의 이름에 대한 스웨덴의 원래 철자는 실제로 '토르'입니다.
— dala

덴마크어에서는 ls -lort"shit"에 대한 덴마크어 단어를 사용할 수 있습니다 . 어떤 그룹을 생략하고 :) valhal의 분노 못하고
— 예스퍼 Rønn - 젠슨

1
톨킨과 반지의 제왕과 관련이있는 "ls -lotr"와 같이 말할 수도 있습니다.
— ADEpt

28

참신함이 더 많지만 영리합니다 ...

사용 된 상위 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

1
짧고 빠른 버전은 다음과 같습니다.history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | sort -nr | head
— 추후 공지가있을 때까지 일시 중지되었습니다.

25

^ R 역방향 검색. ^ R을 누르고 일치시키려는 이전 명령의 단편을 입력 한 후 원하는 명령을 찾을 때까지 ^ R을 누르십시오. 그런 다음 여전히 내 기록에있는 최근에 사용한 명령을 기억할 필요가 없습니다. 배시뿐만 아니라 : 줄 끝의 ^ E, 줄의 시작의 ^ A, 커서의 앞뒤에 각각 ^ U 및 ^ K를 삭제합니다.


2
나는 어떤 이유로 ^ U를 기억할 수 없다. 단어 삭제 삭제 바로 가기도 없습니까?
— hoyhoy 2018 년

1
^ W는 커서 앞에있는 단어를 삭제합니다. (이것으로 답을 자유롭게 편집하십시오.)
— Jon Ericson

2
^ R은 질문에서 언급되기에 너무 유용합니다 :)
— Mark Baker

20

나는 종종 vi, ls 등에 대한 별칭을 가지고 있지만 때로는 별칭을 이스케이프하려고합니다. 명령 앞에 백 슬래시를 추가하십시오.

예 :

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

쿨하지 않습니까?


또한 실행할 수 있습니다 command이따 SHELL BUILTIN COMMANDS배쉬 설명서에.
— Iceland_jack

17

다음은 몇 가지 구성 조정입니다.

~/.inputrc:

"\C-[[A": history-search-backward
"\C-[[B": history-search-forward

이것은 ^R대신 화살표 키를 사용 하는 것과 동일하게 작동합니다 . 즉, 입력 (예 :) cd /media/한 다음 위쪽 화살표를 눌러 마지막으로 이동 한 항목으로 이동할 cd수 있습니다./media/ 폴더 합니다.

(Gnome Terminal을 사용하므로 다른 터미널 에뮬레이터의 이스케이프 코드를 변경해야 할 수도 있습니다.)

배쉬 완성도 매우 유용하지만 훨씬 더 미묘합니다. 에서 ~/.bashrc:

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

이는 프로그램 별 탭 완성을 가능하게합니다 (예 : 명령 행이 다음과 같이 시작될 때 탭 완성 시도) evince 하면 evince가 열 수있는 파일 만 표시되고 탭 완성 명령 줄 옵션도 표시됨).

다음과 같이 잘 작동합니다 ~/.inputrc.

set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on

+1 bash_completion은 대단합니다
— prestomation

Mac에서는 화살표 키를 사용하여 기록 검색을 활성화 할 수 있습니다. bind ' "\ e [A"': history-search-backward bind ' "\ e [B"': history-search-forward
— Asmus

17

나는 다음을 많이 사용합니다.

:p수정은 역사의 결과를 인쇄 할 수 있습니다. 예 :

!!:p

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

비슷한 맥락에서 :

!?foo?:p

문자열 'foo'를 포함하는 가장 최근의 명령에 대한 기록을 검색하여 인쇄합니다.

인쇄 할 필요가 없으면

!?foo

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


2
: p를 사용하는 대신 magic-space를 사용할 수도 있습니다. stackoverflow.com/questions/603696/…
— Yoo

bashrc에에 confiure의 마술 (magick) 공간을 실행하지 않고 역사적 컨트롤을 확장bind Space:magic-space # !pin<space>
— SergioAraujo

16

나는 비밀 무기를 가지고있다 : shell-fu.

대부분의 경우 한 줄에 맞는 수천 가지 스마트 팁, 멋진 트릭 및 효율적인 레시피가 있습니다.

내가 좋아하는 것 (그러나 파이썬이 대부분의 유닉스 시스템에 설치되어 있다는 사실을 사용하기 때문에 약간의 속임수) :

alias webshare='python -m SimpleHTTPServer'

이제 "webshare"를 입력 할 때마다 현재 디렉토리는 포트 8000을 통해 사용할 수 있습니다. usb 키나 원격 디렉토리없이 로컬 네트워크에서 친구와 파일을 공유하고 싶을 때 정말 좋습니다. 스트리밍 비디오 및 음악도 작동합니다.

그리고 물론 완전히 쓸모는 없지만 여전히 많은 고전적인 포크 폭탄 :

$ :(){ :|:& };:

프로덕션 서버에서 시도하지 마십시오 ...


나는 웹 공유해서는 안되는 것 같아요 /
— Yoo

나는 당신이 명령을 단순화 할 수 있다고 생각합니다 python -m SimpleHTTPServer(원래 명령이 멋진 것을 놓치지 않는 한
— Jesper Rønn-Jensen

Meh. 프로덕션 서버에서는 해당 포크 폭탄이 OS에 의해 스 uel 치됩니다. 모든 사용자가 만들 수있는 프로세스 수에는 제한이 있습니다.
— Donal Fellows

3
@Donal : 시도해보고 결과를보고해야합니다.
— Michael Foukarakis

12

watch 명령을 다른 명령과 함께 사용하여 변경 사항을 찾을 수 있습니다. 예를 들어 라우터를 테스트 할 때 신호 대 잡음비 등과 같은 최신 정보를 얻고 싶었습니다.

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

watch 명령은 정말 멋지다. 필자는 약 5 년 전에 Linux Server Hacks 책을 읽었습니다. 그것이 존재한다는 것을 누가 알았습니까?
— hoyhoy 2018 년

11
세계에서 '시계'는 배쉬와 어떤 관련이 있습니까?
— Artem Russakovskii


11

echo를 사용하여 명령을 구성 하고 셸로 파이프하는 것을 좋아합니다 .

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

왜? 그렇게하기 전에해야 할 일을 살펴볼 수 있기 때문입니다. 그렇게하면 (홈 디렉토리 제거와 같은) 끔찍한 오류가 발생하면 발생하기 전에 잡을 수 있습니다. 분명히 이것은 파괴적이거나 돌이킬 수없는 행동에 가장 중요합니다.


1
공백이있는 파일 및 폴더의 문제점을 피하기 위해 find -print0 및 xargs -0을 사용할 수 있습니다.
— neu242

또는 이름에 공백이있는 파일 및 폴더를 작성하고 작업하지 마십시오. ;-) 분명히 사용자가 생성 한 이름으로 작업하는 경우 제안이 중요합니다.
— Jon Ericson

4
"echo"를 제거 할 수 있는데 왜 "| ksh -s"를 추가 하시겠습니까?
— 유

GNU find로 파이프 할 필요가 없습니다 :$ find dir -name \\*~ -exec rm {} +
— bobbogo

10

큰 파일을 다운로드 할 때 나는 종종 다음을 수행합니다.

while ls -la <filename>; do sleep 5; done

그런 다음 ctrl + c를 완료하면 (또는 ls0이 아닌 경우). watch프로그램 과 비슷 하지만 대신 쉘을 사용하므로가없는 플랫폼에서 작동합니다 watch.

또 다른 유용한 도구는 netcat 또는 nc입니다. 당신이 할 경우 :

nc -l -p 9100 > printjob.prn

그런 다음 다른 컴퓨터에서 프린터를 설정할 수 있지만 대신 netcat을 실행하는 컴퓨터의 IP 주소를 사용할 수 있습니다. 인쇄 작업이 전송되면 netcat을 실행하는 컴퓨터에서 인쇄 작업을 수신하여printjob.prn .


예를 들어 왜 그렇지 wget않습니까?
— porges

시도하십시오 watch ls -la <filename>(기본값 2 초가 마음에 들지 않으면 -n5를 사용 하십시오 ).
— Ted Percival

1
@Ted watch는 Solaris, Mac OS X 등과 같은 모든 플랫폼에서 사용할 수 없습니다. @Porges, 무슨 뜻인지 잘 모르겠습니다. wget도 포트에서들을 수 있습니까?
— dreamlax


10

트리 계층 구조에서 크게 다른 위치에 여러 디렉토리를 사용하는 경우 탐색하는 가장 좋은 방법은 acf_func.sh (아래에 나열)를 사용하는 것입니다. 정의되면 할 수 있습니다

cd-

숫자 메뉴가있는 최근 디렉토리 목록을 보려면

CD -2

두 번째로 최근 디렉토리로 이동합니다.

사용하기 매우 편리합니다.

코드는 다음과 같습니다.

# do ". acd_func.sh"
# acd_func 1.0.5, 10-nov-2004
# petar marinov, http:/geocities.com/h2428, this is public domain

cd_func ()
{
  local x2 the_new_dir adir index
  local -i cnt

  if [[ $1 ==  "--" ]]; then
    dirs -v
    return 0
  fi

  the_new_dir=$1
  [[ -z $1 ]] && the_new_dir=$HOME

  if [[ ${the_new_dir:0:1} == '-' ]]; then
    #
    # Extract dir N from dirs
    index=${the_new_dir:1}
    [[ -z $index ]] && index=1
    adir=$(dirs +$index)
    [[ -z $adir ]] && return 1
    the_new_dir=$adir
  fi

  #
  # '~' has to be substituted by ${HOME}
  [[ ${the_new_dir:0:1} == '~' ]] && the_new_dir="${HOME}${the_new_dir:1}"

  #
  # Now change to the new dir and add to the top of the stack
  pushd "${the_new_dir}" > /dev/null
  [[ $? -ne 0 ]] && return 1
  the_new_dir=$(pwd)

  #
  # Trim down everything beyond 11th entry
  popd -n +11 2>/dev/null 1>/dev/null

  #
  # Remove any other occurence of this dir, skipping the top of the stack
  for ((cnt=1; cnt <= 10; cnt++)); do
    x2=$(dirs +${cnt} 2>/dev/null)
    [[ $? -ne 0 ]] && return 0
    [[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}"
    if [[ "${x2}" == "${the_new_dir}" ]]; then
      popd -n +$cnt 2>/dev/null 1>/dev/null
      cnt=cnt-1
    fi
  done

  return 0
}

alias cd=cd_func

if [[ $BASH_VERSION > "2.05a" ]]; then
  # ctrl+w shows the menu
  bind -x "\"\C-w\":cd_func -- ;"
fi

10

겁에 질린 엔터를 치기 전에 복잡한 선을 확장하십시오

  • Alt+ Ctrl+ e— 쉘 확장 라인 ( 키보드에서 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

&씨.


+1, 난 항상 눌러 Enter:)
— João Portela

이 중 아무것도 몰랐습니다. 실행 취소는 살인자입니다. 모든 명령 줄 편집에 좋습니다.
— Philippe A.

9

나는 항상 부분적이었습니다.

ctrl-E # move cursor to end of line
ctrl-A # move cursor to beginning of line

또한을 사용 shopt -s cdable_vars하면 공통 디렉토리에 bash 변수를 작성할 수 있습니다. 따라서 회사의 소스 트리를 위해 다음과 같은 변수를 만듭니다.

export Dcentmain="/var/localdata/p4ws/centaur/main/apps/core"

그런 다음에 의해 해당 디렉토리로 변경할 수 있습니다 cd Dcentmain.


Home과 End는 crtl-A 및 ctrl-E와 동일한 작업을 수행합니다.
— davidfg4 2009

이것은 홈 및 종료 키가없는 Mac 랩톱에서 도움이됩니다.
— jamesh 2009

불행히도 ctrl-A는 screen기본적으로 이스케이프 키입니다 . 내에서 ctrl-X로 다시 매핑 .screenrc하지만 이맥스 사용자가 아닙니다.
— 시스템 일시

cdable_vars 옵션과 관련하여 CDPATH 환경 변수도 있습니다. 그러나 PATH에서와 같이 상위 디렉토리를 설정했기 때문에 다르게 작동합니다. cdable_vars를 사용하면 더 많은 제어권을 얻을 수 있습니다.
— Zecc

1
바로 가기 목록에 대한 추가 정보 : CTRL + K는 커서에서 줄 끝까지 모든 것을 삭제하고 CTRL + U는 커서 앞의 모든 것을 삭제하고 ALT + F / ALT + B를 사용하여 한 단어를 앞 / 뒤로 이동 (또는 CTRL + 왼쪽 화살표 / CTRL) + 오른쪽 화살표). cdable_vars +1!
— Philippe A.

8

pbcopy

Mac 시스템 클립 보드에 복사됩니다. 명령을 파이프로 연결할 수 있습니다.

pwd | pbcopy


NB! 이것은 Mac 고유의 명령입니다.
— dala

alias pbcopy='xsel --clipboard --input' 그리고 : alias pbpaste='xsel --clipboard --output'
— wawawawa


7

.bashrc에서 명령 줄에서 'set -o vi'를 사용하면 명령 줄에서 vi 편집 모드가됩니다. '삽입'모드에서 시작하여 정상적으로 입력하고 백 스페이스 할 수 있지만 '큰'실수를하면 esc 키를 누른 다음 vi에서와 같이 'b'와 'f'를 사용하여 이동할 수 있습니다. cw는 단어를 변경합니다. 변경하려는 히스토리 명령을 가져온 후 특히 유용합니다.


7

위의 많은 것들과 유사하게, 현재 가장 좋아하는 것은 키 입력입니다 [alt]. (Alt와 "."키를 함께) 이것은 $!와 같습니다. (이전 명령에서 마지막 인수를 삽입합니다.) 즉시 입력하기가 더 쉽다는 점을 제외하고. (스크립트에서는 사용할 수 없습니다)

예 :

mkdir -p /tmp/test/blah/oops/something
cd [alt].

또한 Alt- [0-9]와 조합 해보십시오 (첫 번째 조합을 눌렀다가 놓은 후 두 번째로칩니다). 예를 들어 마지막 명령이 'mv foo bar'인 경우 "Alt-0 Alt-." 'mv', "Alt-1 Alt-." 'foo', "Alt-2 Alt-"를 제공합니다. 기본 Alt-. 둘 다 '막대기'등을 제공
— Sam Stokes

1
Alt-를 눌러보십시오. 두 번 이상 (또는 Alt 키를 누른 상태에서 점을 여러 번 누른 다음 Alt 키를)니다) Ctrl-R을 두 번 이상 누르는 것과 유사합니다.
— Yoo

7

&& 명령을 사용하여 여러 명령을 함께 묶습니다 .

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

또는

kill -9 1111 && ./start.sh

1
하나가 실패하면 다른 명령이 실행되지 않습니다 (프로그래밍과 같이 빨리 실패)
— Frederic Morin

1
반대는 논리 또는 '||'를 사용하는 것입니다 오른쪽이 왼쪽이 거짓 인 경우에만 실행됩니다. 예 : <code> command_1 || command_2 </ code>
— dala
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.