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


Answers

접미어가있는 파일 이름 바꾸기 / 이동을 빠르게 수행합니다.
cp /home/foo/realllylongname.cpp{,-old}

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

Question

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

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




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

예 :

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



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

$ 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이 아닌 경우) ctrl + c를 입력하십시오. watch 프로그램과 비슷하지만 대신 셸을 사용하므로 watch 없이 플랫폼에서 작동합니다.

또 다른 유용한 도구는 netcat 또는 nc 입니다. 당신이하는 일 :

nc -l -p 9100 > printjob.prn

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




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

가장 최근에 수정 된 파일을 편리하게 읽을 수있는 형식으로 나열하기 위해 신의 힘을 소환합니다.




ESC .

마지막 bash 명령의 마지막 인수를 삽입합니다. 그것은 당신이 생각하는 것보다 더 유용합니다.

cp file /to/some/long/path

cd ESC .




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

~/.inputrc :

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

^R 같지만 대신 화살표 키를 사용합니다. 즉, cd /media/ 한 다음 위로 화살표를 누르면 마지막으로 /media/ 폴더 안에 cd 를 넣을 수 있습니다.

(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



명령을 실행할 때, 때로는 이전 인수를 사용하여 명령을 실행하려고합니다. 이렇게하려면이 바로 가기를 사용할 수 있습니다.

$ 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가 forward search로 해석 할 수 없게합니다.

stty stop ""



물론, 당신은 " 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 더 많은 예제가 있습니다.




cd -

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




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




type -a PROG

/ usr / bin / PROG에있는 것보다는 ~ / bin에있는 곳에서 PROG를 사용할 수있는 곳을 찾아야합니다.




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

  • 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

&기음.




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

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



나는 가장 최근 제출 된 명령 줄에서 마지막 항목, 첫 번째 비 명령 항목 및 모든 비 명령 항목을 반환하는 !$ ,! !^!* 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



^ R 반전 검색. ^ R을 누르고, 일치시키고 자하는 이전 명령의 단편을 입력하고, 원하는 명령을 찾을 때까지 ^ R을 누르십시오. 그렇다면 최근에 사용한 명령을 기억하지 않아도됩니다. 독점적으로 bash는 아니지만 줄의 끝은 ^ E, 줄의 시작은 ^ A, 커서의 앞뒤는 ^ U, ^ K는 각각 삭제합니다.




하나의 트리 탐색 구조에서 여러 디렉토리를 여러 곳에서 사용할 때 선호하는 방법은 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



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

대부분의 시간이 한 줄에 들어간 스마트 팁, 시원한 트릭 및 효율적인 조리법이 있습니다.

내가 좋아하는 것 (하지만 파이썬이 현재 대부분의 유닉스 시스템에 설치되었다는 사실을 사용하기 때문에 나는 약간의 속임수를 쓴다.) :

alias webshare='python -m SimpleHTTPServer'

이제 "webshare"를 입력 할 때마다 현재 디렉토리가 포트 8000을 통해 사용 가능할 것입니다. usb 키나 원격 디렉토리없이 로컬 네트워크에서 친구들과 파일을 공유하고자 할 때 정말 좋습니다. 스트리밍 비디오 및 음악 역시 효과가 있습니다.

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

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

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




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

예 :

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

멋지지 않습니까?




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

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

또는

kill -9 1111 && ./start.sh



이름 바꾸기

예:

$ 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

매우 유용합니다.




$ 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



또 다른 마음에 드는 것 :

!!

마지막 명령을 반복합니다. 가장 유용한 형태 :

sudo !!



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

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

!!:p

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

비슷한 맥락에서 :

!?foo?:p

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

인쇄 할 필요가없는 경우,

!?foo

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




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

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

Bash 명령 행 이력 가이드




pbcopy

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

pwd | pbcopy




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

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



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




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

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 사용하여 해당 디렉토리로 변경할 수 있습니다.




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

ls -d */

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