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

StackOverflow https://stackoverflow.com/questions/68372

  •  09-06-2019
  •  | 
  •  

문제

우리 모두 사용법을 알고 있어요 <ctrl>-R 기록을 통해 검색을 되돌리려면 다음을 사용할 수 있다는 것을 알고 계셨습니까? <ctrl>-S 설정한 경우 검색을 전달하려면 stty stop ""?또한 나열된 모든 키보드 단축키를 확인하기 위해 바인딩 -p를 실행해 본 적이 있습니까?Mac OS X에는 기본적으로 455개 이상이 있습니다.

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

도움이 되었습니까?

해결책 7

명령을 실행할 때 때로는 이전 인수를 사용하여 명령을 실행하고 싶을 때가 있습니다.그렇게 하려면 다음 단축키를 사용할 수 있습니다.

$ 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

내가 하는 또 다른 일은 내 기록의 일부 명령을 무시하는 것입니다.종료 명령을 기억할 필요가 없습니다.

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

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

shopt -s histappend

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

shopt -s cmdhist

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

stty stop ""

다른 팁

접미사가 포함된 파일의 이름을 빠르게 바꾸거나 이동하려면 다음을 수행하세요.
cp /home/foo/realllylongname.cpp{,-old}

이는 다음으로 확장됩니다.
cp /home/foo/realllylongname.cpp /home/foo/realllylongname.cpp-old

cd -

이는 뒤로 버튼과 동일한 명령줄입니다(현재 있던 이전 디렉터리로 이동).

또 다른 마음에 드는 것:

!!

마지막 명령을 반복합니다.다음 형식에서 가장 유용합니다.

sudo !!

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

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

Bash 명령줄 기록 가이드

이름 바꾸기

예:

$ 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

너무 유용해요

나는 ~의 팬이다 !$, !^ 그리고 !* 가장 최근에 제출된 명령줄에서 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

목록 작성 방법 오직 현재 디렉토리의 하위 디렉토리?

ls -d */

그것은 간단한 트릭이지만, 내가 그것을 찾는 데 얼마나 많은 시간이 필요했는지 당신은 모를 것입니다!

ESC.

마지막 bash 명령의 마지막 인수를 삽입합니다.생각보다 유용하게 쓰입니다.

cp file /to/some/long/path

CD ESC.

물론 넌 할 수있어 "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 목록이 설치되어 있는지 확인하고 싶다고 가정해 보겠습니다.각 서버에 SSH로 연결하는 대신 각 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-Scripting Guide에는 더 많은 예가 있습니다. http://tldp.org/LDP/abs/html/process-sub.html.

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

그것은 신들의 힘 가장 최근에 수정된 파일을 편리하게 읽을 수 있는 형식으로 나열합니다.

참신함에 가깝지만 영리합니다.

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

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

vi, ls 등의 별칭을 사용하는 경우가 많습니다.하지만 때로는 별칭을 벗어나고 싶을 때도 있습니다.앞에 있는 명령에 백슬래시를 추가하면 됩니다.

예:

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

멋지지 않나요?

다음은 몇 가지 구성 변경 사항입니다.

~/.inputrc:

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

이는 다음과 동일하게 작동합니다. ^R 대신 화살표 키를 사용하세요.이는 내가 입력할 수 있다는 것을 의미합니다(예:) cd /media/ 그런 다음 위쪽 화살표를 눌러 마지막 항목으로 이동합니다. cd안쪽으로 갔어 /media/ 폴더.

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

Bash 완성도 매우 유용하지만 훨씬 더 미묘한 추가 기능입니다.~ 안에 ~/.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

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

그만큼 :p 기록 결과를 인쇄하는 수정자입니다.예:

!!:p

다시 실행하기 전에 올바른지 확인할 수 있도록 마지막 명령을 인쇄합니다.그냥 입력하세요 !! 그것을 실행하기 위해.

비슷한 맥락에서:

!?foo?:p

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

인쇄할 필요가 없다면,

!?foo

검색해서 바로 실행합니다.

나는 비밀 무기를 가지고 있습니다 : 쉘푸.

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

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

alias webshare='python -m SimpleHTTPServer'

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

물론 완전히 쓸모는 없지만 여전히 재미있는 고전적인 포크 폭탄은 다음과 같습니다.

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

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

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

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

Prog가 제공되는 모든 장소를 찾으려면 일반적으로 예상되는/usr/bin/prog의 ~/bin 어딘가에 있습니다.

나는 명령을 구성하는 것을 좋아합니다. 에코 그리고 그것들을 쉘에 파이프하십시오:

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

왜?왜냐하면 그 일을 하기 전에 내가 무슨 일을 할지 미리 볼 수 있기 때문입니다.그렇게 하면 끔찍한 오류(예: 홈 디렉토리 제거)가 발생하더라도 오류가 발생하기 전에 이를 포착할 수 있습니다.분명히 이는 파괴적이거나 취소할 수 없는 행동에 가장 중요합니다.

대용량 파일을 다운로드할 때 다음과 같은 작업을 자주 수행합니다.

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

그런 다음 작업이 끝나면 Ctrl+C를 누르세요(또는 ls 0이 아닌 값을 반환합니다).와 비슷해요 watch 프로그램이지만 대신 셸을 사용하므로 플랫폼 없이도 작동합니다. watch.

또 다른 유용한 도구는 netcat입니다. nc.그렇게 하는 경우:

nc -l -p 9100 > printjob.prn

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

pushd 그리고 popd 거의 항상 유용하다

트리 계층 구조에서 크게 분리된 위치에 있는 여러 디렉터리를 사용할 때 선호하는 탐색 방법 중 하나는 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

두려운 Enter 키를 누르기 전에 복잡한 줄을 확장하세요.

  • Alt+Ctrl 키+이자형쉘 확장 라인 (사용해야 할 수도 있음 Esc, Ctrl 키+이자형 키보드에서)
  • Ctrl 키+_실행 취소
  • Ctrl 키+엑스, *글로벌 확장 단어

$ echo !$ !-2^ * Alt+Ctrl 키+이자형
$ echo aword someotherword * Ctrl 키+_
$ echo !$ !-2^ * Ctrl 키+엑스, *
$ echo !$ !-2^ LOG Makefile bar.c foo.h

&씨.

나는 항상 다음 사항에 관심을 가졌습니다.

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.

pbcopy

그러면 Mac 시스템 클립보드에 복사됩니다.명령을 파이프로 연결할 수 있습니다. 다음을 시도해 보세요.

pwd | pbcopy

$ touch {1,2}.txt
$ ls [12].txt
1.txt  2.txt
$ rm !:1
rm [12].txt
$ history | tail -10
...
10007  touch {1,2}.txt
...
$ !10007
touch {1,2}.txt
$ for f in *.txt; do mv $f ${f/txt/doc}; done

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

위의 많은 항목과 마찬가지로 제가 현재 가장 좋아하는 키 입력은 [alt]입니다.(Alt와 "." 키를 함께 사용) 이는 $!와 동일합니다.(이전 명령의 마지막 인수를 삽입합니다.) 즉각적이고 입력하기가 더 쉽다는 점만 제외하면 됩니다.(스크립트에서는 사용할 수 없습니다)

예:

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

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

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

또는

kill -9 1111 && ./start.sh
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top