우리는 모두 <ctrl>-R
히스토리를 통해 검색을 되 돌리는 방법을 알고 있지만 <ctrl>-S
설정하면 검색을 전달 하는 데 사용할 수 있다는 것을 알고 stty stop ""
있습니까? 또한 bind -p를 실행하여 모든 키보드 단축키를 나열한 적이 있습니까? Mac OS X에는 기본적으로 455 개가 넘습니다.
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 -
뒤로 버튼과 동일한 명령 행입니다 (이전 디렉토리로 이동합니다).
pushd
하고 popd
유지하는 것을 선호한다 .
man cd
, 또는 cd --help
(적어도 내에서).
또 다른 마음에 드는 것 :
!!
마지막 명령을 반복합니다. 다음과 같은 형태로 가장 유용합니다.
sudo !!
mkdir testdir; cd !$
.. 이것은 실행됩니다 cd [last word of previous line]
(예제에서 cd testdir
)
내가 가장 좋아하는 것은 '^ string ^ string2'입니다.이 명령은 마지막 명령을 사용하고 string을 string2로 바꾸고 실행합니다.
$ ehco foo bar baz
bash: ehco: command not found
$ ^ehco^echo
foo bar baz
!!:gs/ehco/echo/
!!:gs/ehco/echo/
수행 (협의의 마지막 명령에 대한 글로벌 검색 및 교체 !!
에 stackoverflow.com/questions/68372/... ). 이는 ^ehco^echo
"ehco"의 한 인스턴스를 대체하는 것과 같지 않습니다 .보다 정확한 응답은 다음과 같습니다 !!:s/ehco/scho
.
이름을 바꾸다
예:
$ 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 */
그것은 간단한 트릭이지만, 그 것을 찾는 데 얼마나 많은 시간이 필요한지 알 수 없습니다!
alias lsd='ls -F | grep --color /'
겪을 수있는 최선은이었다 . 그러나 쉽게 구문 분석 할 수 있도록 한 줄에 하나의 디렉토리를 나열합니다. 동일한 작업을 수행하도록 명령을 수정했습니다.ls -d1 */
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"입니다
신의 힘을 소환하여 가장 최근에 수정 한 파일을 읽기 쉬운 형식으로 나열합니다.
ls -bart -simpson -ruls
시킵니다. S, ICNR
ls -lort
"shit"에 대한 덴마크어 단어를 사용할 수 있습니다 . 어떤 그룹을 생략하고 :) valhal의 분노 못하고
참신함이 더 많지만 영리합니다 ...
사용 된 상위 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
history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | sort -nr | head
^ R 역방향 검색. ^ R을 누르고 일치시키려는 이전 명령의 단편을 입력 한 후 원하는 명령을 찾을 때까지 ^ R을 누르십시오. 그런 다음 여전히 내 기록에있는 최근에 사용한 명령을 기억할 필요가 없습니다. 배시뿐만 아니라 : 줄 끝의 ^ E, 줄의 시작의 ^ A, 커서의 앞뒤에 각각 ^ U 및 ^ K를 삭제합니다.
나는 종종 vi, ls 등에 대한 별칭을 가지고 있지만 때로는 별칭을 이스케이프하려고합니다. 명령 앞에 백 슬래시를 추가하십시오.
예 :
$ alias vi=vim
$ # To escape the alias for vi:
$ \vi # This doesn't open VIM
쿨하지 않습니까?
command
이따 SHELL BUILTIN COMMANDS
배쉬 설명서에.
다음은 몇 가지 구성 조정입니다.
~/.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
검색을 수행하고 바로 실행합니다.
bind Space:magic-space # !pin<space>
나는 비밀 무기를 가지고있다 : shell-fu.
대부분의 경우 한 줄에 맞는 수천 가지 스마트 팁, 멋진 트릭 및 효율적인 레시피가 있습니다.
내가 좋아하는 것 (그러나 파이썬이 대부분의 유닉스 시스템에 설치되어 있다는 사실을 사용하기 때문에 약간의 속임수) :
alias webshare='python -m SimpleHTTPServer'
이제 "webshare"를 입력 할 때마다 현재 디렉토리는 포트 8000을 통해 사용할 수 있습니다. usb 키나 원격 디렉토리없이 로컬 네트워크에서 친구와 파일을 공유하고 싶을 때 정말 좋습니다. 스트리밍 비디오 및 음악도 작동합니다.
그리고 물론 완전히 쓸모는 없지만 여전히 많은 고전적인 포크 폭탄 :
$ :(){ :|:& };:
프로덕션 서버에서 시도하지 마십시오 ...
python -m SimpleHTTPServer
(원래 명령이 멋진 것을 놓치지 않는 한
watch 명령을 다른 명령과 함께 사용하여 변경 사항을 찾을 수 있습니다. 예를 들어 라우터를 테스트 할 때 신호 대 잡음비 등과 같은 최신 정보를 얻고 싶었습니다.
watch --interval=10 lynx -dump http://dslrouter/stats.html
type -a PROG
PROG를 사용할 수있는 모든 위치를 찾으려면 일반적으로 / usr / bin / PROG의 위치가 아닌 ~ / bin의 어딘가에 있습니다.
PATH
그들 각각을 보여줄 것입니다.
echo를 사용하여 명령을 구성 하고 셸로 파이프하는 것을 좋아합니다 .
$ find dir -name \*~ | xargs echo rm
...
$ find dir -name \*~ | xargs echo rm | ksh -s
왜? 그렇게하기 전에해야 할 일을 살펴볼 수 있기 때문입니다. 그렇게하면 (홈 디렉토리 제거와 같은) 끔찍한 오류가 발생하면 발생하기 전에 잡을 수 있습니다. 분명히 이것은 파괴적이거나 돌이킬 수없는 행동에 가장 중요합니다.
$ find dir -name \\*~ -exec rm {} +
큰 파일을 다운로드 할 때 나는 종종 다음을 수행합니다.
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
.
wget
않습니까?
watch ls -la <filename>
(기본값 2 초가 마음에 들지 않으면 -n5를 사용 하십시오 ).
watch
는 Solaris, Mac OS X 등과 같은 모든 플랫폼에서 사용할 수 없습니다. @Porges, 무슨 뜻인지 잘 모르겠습니다. wget도 포트에서들을 수 있습니까?
트리 계층 구조에서 크게 다른 위치에 여러 디렉토리를 사용하는 경우 탐색하는 가장 좋은 방법은 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
$ echo !$ !-2^ *
Alt+ Ctrl+ e
$ echo aword someotherword *
Ctrl+ _
$ echo !$ !-2^ *
Ctrl+ x, *
$echo !$ !-2^ LOG Makefile bar.c foo.h
&씨.
Enter
:)
나는 항상 부분적이었습니다.
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
.
screen
기본적으로 이스케이프 키입니다 . 내에서 ctrl-X로 다시 매핑 .screenrc
하지만 이맥스 사용자가 아닙니다.
$ 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
history 10
대신 history | tail -10
( tail -n 10
구문이 더 이상 사용되지 않으므로) 대신 사용하십시오 .
위의 많은 것들과 유사하게, 현재 가장 좋아하는 것은 키 입력입니다 [alt]. (Alt와 "."키를 함께) 이것은 $!와 같습니다. (이전 명령에서 마지막 인수를 삽입합니다.) 즉시 입력하기가 더 쉽다는 점을 제외하고. (스크립트에서는 사용할 수 없습니다)
예 :
mkdir -p /tmp/test/blah/oops/something
cd [alt].
&& 명령을 사용하여 여러 명령을 함께 묶습니다 .
./run.sh && tail -f log.txt
또는
kill -9 1111 && ./start.sh