Programing

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

crosscheck 2020. 6. 5. 18:54
반응형

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


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

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


접미사가있는 파일 이름 바꾸기 / 이동 :
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

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


이름을 바꾸다

예:

$ 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과 같이 "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

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

$ 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 ""

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

ls -d */

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


ESC.

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

cp file /to/some/long/path

CD ESC.


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


내가 가장 좋아하는 명령은 "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을 누르십시오. 그런 다음 여전히 내 기록에있는 최근에 사용한 명령을 기억할 필요가 없습니다. 배시뿐만 아니라 : 줄 끝의 ^ 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을 사용하므로 다른 터미널 에뮬레이터의 이스케이프 코드를 변경해야 할 수도 있습니다.)

배쉬 완성도 매우 유용하지만 훨씬 더 미묘합니다. 에서 ~/.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

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


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

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

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

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의 어딘가에 있습니다.


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를 완료하면 (또는 ls0이 아닌 경우). watch프로그램 과 비슷 하지만 대신 쉘을 사용하므로가없는 플랫폼에서 작동합니다 watch.

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

nc -l -p 9100 > printjob.prn

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


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


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

cd-

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

CD -2

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

Very easy to use, very handy.

Here's the code:

# 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

Expand complicated lines before hitting the dreaded enter

  • Alt+Ctrl+eshell-expand-line (may need to use Esc, Ctrl+e on your keyboard)
  • Ctrl+_undo
  • 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

&c.


I've always been partial to:

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

I also use shopt -s cdable_vars, then you can create bash variables to common directories. So, for my company's source tree, I create a bunch of variables like:

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

then I can change to that directory by cd Dcentmain.


pbcopy

This copies to the Mac system clipboard. You can pipe commands to it...try:

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

Using 'set -o vi' from the command line, or better, in .bashrc, puts you in vi editing mode on the command line. You start in 'insert' mode so you can type and backspace as normal, but if you make a 'large' mistake you can hit the esc key and then use 'b' and 'f' to move around as you do in vi. cw to change a word. Particularly useful after you've brought up a history command that you want to change.


Similar to many above, my current favorite is the keystroke [alt]. (Alt and "." keys together) this is the same as $! (Inserts the last argument from the previous command) except that it's immediate and for me easier to type. (Just can't be used in scripts)

eg:

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

String multiple commands together using the && command:

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

or

kill -9 1111 && ./start.sh

참고URL : https://stackoverflow.com/questions/68372/what-is-your-single-most-favorite-command-line-trick-using-bash

반응형