일부 사람들에게는 시작 스크립트가 있고 일부 사람들은 프롬프트를 개인화한다는 것을 알고 있습니다. 한 개발자는 자주 방문하는 긴 경로와 자주 실행하는 명령에 짧은 별칭을 사용합니다.
생산성과 사용 편의성을 높이기 위해 UNIX 프로파일에서 수행 한 모든 효과적인 사용자 정의는 무엇입니까?
일부 사람들에게는 시작 스크립트가 있고 일부 사람들은 프롬프트를 개인화한다는 것을 알고 있습니다. 한 개발자는 자주 방문하는 긴 경로와 자주 실행하는 명령에 짧은 별칭을 사용합니다.
생산성과 사용 편의성을 높이기 위해 UNIX 프로파일에서 수행 한 모든 효과적인 사용자 정의는 무엇입니까?
답변:
w!!
.
cmap w!! w !sudo tee % > /dev/null
grep
ing
할 때 장치 또는 이진 파일을 신경 쓰지 마십시오 .
alias grep='grep --color=auto --binary-files=without-match --devices=skip'
cat 1337.sh | webshare
alias webshare='curl -F "sprunge=<-" http://sprunge.us | xclip'
클립 보드에 짧은 URL 을 돌려줍니다 . 반환 된 URL 에 추가 ?whatever-lang
하여 구문을 강조 표시하고 줄 번호 를 지정할 수 있습니다 .
set editing-mode vi
set keymap vi
하나의 명령으로 디렉토리를 만들고 cd
대부분의 경우 mkdir
다음 명령은 cd <that dir>
입니다.
이렇게하면 입력 내용이 저장됩니다.
# make a directory and cd to it
mcd()
{
test -d "$1" || mkdir "$1" && cd "$1"
}
예를 들면 다음과 같습니다.
/home/mikel$ mcd somedir
/home/mikel/somedir$
내가 유용하다고 생각하는 또 다른 것은 버림받은 디렉토리를 만드는 쉬운 방법입니다. 예를 들어 프로그램을 컴파일하거나이 사이트에서 문제를 재현하려는 경우에도 마찬가지입니다. 때로는 디렉토리 정리를 잊어 버릴 수도 있습니다.
# make a temporary directory and cd to it
mtd()
{
local dir
dir=$(mktemp -d)
if test -n "$dir"
then
if test -d "$dir"
then
echo "$dir"
cd "$dir"
else
echo "mktemp directory $dir does not exist"
fi
else
echo "mktemp didn't work"
fi
}
그것이 작동하는 것을 보여주는 :
/home/mikel$ mtd
/tmp/tmp.wsnZjJ2KN6
/tmp/tmp.wsnZjJ2KN6$
/tmp
재부팅 후 시스템 정리에 의존하고 있지만 쉘을 종료 한 후 temp 디렉토리를 삭제하도록하는 등 향상시킬 수 있습니다.
mcd
여러 해 동안 내 버전을 사용해 왔으며 mtd
곧 같은 것을 추가 할 예정입니다.
mtd() { mcd $TMP/`date +%y%m%d-%H%M%S-%N`; }
. 아마도 이식성이 부족하지만 나에게 충분합니다.
bash 프롬프트가 0이 아닌 경우 이전 명령의 종료 코드를 표시하도록하고 싶습니다. 나는 또한 그것을 사용할 때 껍질이 나를 응원하는 것을 좋아하므로 약간의 침묵을 추가했습니다.
smiley() {
RC=$?
[[ ${RC} == 0 ]] && echo ':)' || echo ":( ${RC}"
}
export PS1="\$(smiley) \h [\A] [\W] \$ "
그래서 명령을 실행할 때 멋진 시각적 피드백을 얻습니다.
:) mycomputer [23:03] [~] $ sh -c 'exit 0'
:) mycomputer [23:03] [~] $ sh -c 'exit 11'
:( 11 mycomputer [23:03] [~] $
편집 : 이것은 ~ / .bashrc에 넣은 것입니다.
.bashrc
아마도.
.zshrc
:
alias l='ls -CF'
alias ll='ls -ClhF'
alias la='ls -CaF'
alias lla='ls -CalhF'
alias l.='ls -CAF --ignore=\*'
alias ll.='ls -CAlhF --ignore=\*'
alias t='tree -C'
PS1=$'%{\e[0;33m%}%m %{\e[32;1m%}%~ %{\e[0;31m%}%#%{\e[m%} '
bindkey '^[[3~' delete-char
export GREP_OPTIONS="--color"
.xmodmaprc
:
clear lock
keycode 9 = Caps_Lock ISO_Next_Group Caps_Lock ISO_Next_Group
keycode 66 = Escape NoSymbol Escape
add lock = Caps_Lock
(이스케이프 및 Caps Lock 키를 교체합니다).
터미널을 많이 사용하기 때문에 bashrc를 엉망으로 만듭니다. 나는 내 bashrc에 많은 함수를 일반적으로 정의한다. 예 :
아카이브 추출 :
extract () {
libextract () {
if [ -f "$1" ] ; then
case "$1" in
*.tar.bz2) tar xjf "$1" ;;
*.tar.gz) tar xzf "$1" ;;
*.bz2) bunzip2 "$1" ;;
*.rar) rar x "$1" ;;
*.gz) gunzip "$1" ;;
*.tar) tar xf "$1" ;;
*.tbz2) tar xjf "$1" ;;
*.tgz) tar xzf "$1" ;;
*.zip) unzip "$1" ;;
*.Z) uncompress "$1" ;;
*.7z) 7z x "$1" ;;
*) echo "$1 ne moze biti raspakovan!" ;;
esac
else
echo "$1 nije validan fajl"
fi
}
echo "Unesite putanju do direktorijuma u kome se nalaze arhive: " && read dir && dirprovera && cd $dir
for f in *
do
mkdir ./$f-raspakovano && cd ./$f-raspakovano
libextract ./../$f
cd ./../
done
tipka
}
파일 및 폴더 이름 바꾸기 :
frename () {
if [ $# -gt 0 ]
then
dir="$(echo $1)"
dirprovera
cd $dir
for f in *
do
mv "$f" "`echo "$f" | tr -s " " "_" | tr "A-Z" "a-z"`" 2>/dev/null &
done
tipka
else
echo "Upotreba: frename [direktorijum]" >&2
fi
}
큰 파일을 여러 개의 작은 파일로 나누려면 다음과 같이하십시오.
fsplit () {
if [ $# -gt 1 ]
then
file="$(echo $1)"
SIZE="$(echo $2)"
PREFIX="$(echo $3)"
if [ -z "$PREFIX" ]; then PREFIX="fsplit"; fi
fileprovera
split -d -a 3 -b $SIZE $file "$PREFIX-part-" || echo "Doslo je do greske!"
tipka
else
echo "Upotreba: fsplit [fajl] [velicina] [prefix]
Za velicinu se koriste m (MB), g (GB) ili k (KB) (15m, 650kb, 4.7g...)
Prefiks moze sadrzati brojeve, slova, i crtice (primer: moj_pre-fiks)
Ukoliko ne unesete prefiks isti ce biti dodeljen automatski u sledecem formatu:
fsplit-part-XXX
gde XXX predstavlja broj dela fajla (001, 005, 189...)" >&2
fi
}
또한 일부 별칭 (예 : ls, grep 및 small 명령)에서 인수로 하나의 명령을 사용하는 것이 훨씬 더 쉽다는 것을 알기 때문에 매번 모든 별칭을 편집했습니다.
(커뮤니티 위키이므로 각 트릭은 별도의 답변에 속합니다.)
안전한 로그 아웃
Ctrl+ D는 쉘을 종료하는 가장 쉬운 방법이지만 여전히 작업을 실행중인 경우 어쨌든 쉘을 종료합니다. 기본적으로 이는 해당 쉘 내부에서 실행중인 모든 프로그램이 종료됨을 의미합니다.
일부 쉘은 Ctrl+를 D두 번 누른 후에 만 로그 아웃 할 수 있지만 실수로 너무 쉽게 수행 할 수 있습니다.
그래서 그 대신,이를 추가 .bashrc
하거나 .zshrc
또는 중 설정 파일 당신이 선호합니다.
alias x='_exit'
# prevent running "exit" if the user is still running jobs in the background
# the user is expected to close the jobs or disown them
_exit()
{
case $- in *m*)
# this way works in bash and zsh
jobs | wc -l | grep -q '^ *0 *$'
if test $? -eq 0
then
command exit "$@"
else
jobs
fi
;;
*)
command exit "$@"
;;
esac
}
(커뮤니티 위키이므로 각 트릭은 별도의 답변에 속합니다.)
당신이 명령을 실행하는 모든 방법에 대한 역사를 검색
이미 Ctrl+ R에 대해 알고 있을지 모르지만이 방법은 훨씬 매끄 럽습니다.
이미 입력 한 것으로 시작하는 명령에 대한 기록을 검색 하려면 Alt+ P를 설정하십시오 .
예를 들어 ls
Alt+ P, Alt+ P, Alt+ P 는 모든 ls
명령을 통해 뒤로 검색 합니다.
이것을 당신의 /etc/inputrc
또는 .inputrc
위해 넣어야합니다 bash
:
$if mode=emacs
"\ep": history-search-backward
"\en": history-search-forward
$endif
그리고 이것은 당신을 .zshrc
위해 zsh
:
bindkey -M emacs '^[p' history-beginning-search-backward
bindkey -M emacs '^[n' history-beginning-search-forward
한 단계 더 나아가서 위쪽 화살표를 사용하여이 작업을 수행 할 수도 있습니다.
간단한 계산기
$(( ... ))
또는 expr ...
매우 기본적인 계산을 사용 하거나 수행 할 수 있지만 정수 나누기 (예 :
$ expr 3 / 2
1
$ expr 1.5 \* 2
expr: non-integer argument
더 좋은 방법은을 사용하는 것 bc
입니다.
# do some floating point arithmetic
calc()
{
echo "scale=3; $*" | bc
}
그때:
$ calc 3 / 2
1.500
$ calc 1.5 \* 2
3.0
alias py='PYTHONSTARTUP=~/.pythonstartup python'
로 from math import *;
그 파일입니다. 정수 나누기 문제는 여전히 해결되지 않았지만보다 복잡한 연산에 더 유용합니다.
더 나은 탭 완성
Tab아직 아무도 사용자 정의 완료를 언급하지 않았다고 생각 합니다.
여기 내가 가진 것입니다.
두 가지 주요 기능은 다음과 같습니다.
cd <Tab>
디렉토리 만 제안합니다d<Tab>
아직 완료 Desktop
및Downloads
bash의 경우 :
# custom tab completions
if type complete >/dev/null 2>&1
then
if complete -o >/dev/null 2>&1
then
COMPDEF="-o complete"
else
COMPDEF="-o default"
fi
complete -a alias unalias
complete -d cd pushd popd pd po
complete $COMPDEF -g chgrp 2>/dev/null
complete $COMPDEF -u chown
complete -j fg
complete -j kill
complete $COMPDEF -c command
complete $COMPDEF -c exec
complete $COMPDEF -c man
complete -e printenv
complete -G "*.java" javac
complete -F complete_runner -o nospace -o default nohup 2>/dev/null
complete -F complete_runner -o nospace -o default sudo 2>/dev/null
complete -F complete_services service
# completion function for commands such as sudo that take a
# command as the first argument but should complete the second
# argument as if it was the first
complete_runner()
{
# completing the command name
# $1 = sudo
# $3 = sudo
# $2 = partial command (or complete command but no space was typed)
if test "$1" = "$3"
then
set -- `compgen -c "$2"`
# completing other arguments
else
# $1 = sudo
# $3 = command after sudo (i.e. second word)
# $2 = arguments to command
# use the custom completion as printed by complete -p,
# fall back to filename/bashdefault
local comps
comps=`complete -p "$3" 2>/dev/null`
# "complete -o default -c man" => "-o default -c"
# "" => "-o bashdefault -f"
comps=${comps#complete }
comps=${comps% *}
comps=${comps:--o bashdefault -f}
set -- `compgen $comps "$2"`
fi
COMPREPLY=("$@")
}
# completion function for Red Hat service command
complete_services()
{
OIFS="$IFS"
IFS='
'
local i=0
for file in $(find /etc/init.d/ -type f -name "$2*" -perm -u+rx)
do
file=${file##*/}
COMPREPLY[$i]=$file
i=$(($i + 1))
done
IFS="$OIFS"
}
fi
zsh의 경우 :
# set command completions
compctl -a {,un}alias
compctl -b bindkey
compctl -c command
compctl -/ {c,push,pop}d
compctl -E {print,set,unset}env
#compctl -c exec
compctl -f -x "c[-1,exec]" -c -- exec
compctl -j fg
# no -g according to zshcompctl
#compctl -g {ch}grp
compctl -j kill
compctl -c man
compctl -c nohup
compctl -u {ch}own
compctl -o {set,unset}opt
compctl -f -x "c[-1,sudo]" -c -- sudo
compctl -c {whence,where,which}
compctl -M '' 'm:{a-zA-Z}={A-Za-z}'
# make file name completion case-insensitive
zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}'
안전한 압축
압축 프로그램은 기본적으로 원본 파일을 삭제합니다. 나는 그것을 좋아하지 않는다.
alias gzip='gzip --keep'
alias bzip2='bzip2 --keep'
alias xz='xz --keep'
alias lzma='lzma --keep'
여러 줄 프롬프트
tag() {
TAG="${TAG} [$1]" exec zsh
}
reset_tags() {
TAG='' exec zsh
}
color='green'
if [ "${USER}" = 'root' ]; then
color='red'
fi
export PS1="${TAG} %B%F{yellow} *** %F{blue}%~\
%F{yellow}%(1j.[%j] .)%F{red}%(?..(%?%) )%F{${color}}%n@%m %F{blue}%# %f%b"
export RPS1='%B%F{blue}%D{%Y-%m-%d} %F{green}%D{%H:%M:%S}'
export PS2='%B%F{red}%n@%m%k %B%F{blue}%_> %b%f%k'
unset color
환경 변수와 함께 "태그"를 표시 할 수 있습니다. 예:
tag 'DONT SHTUDOWN!!'
reset_tags
히스토리 설정
dont_log() {
HISTFILE="/dev/null" TAG="${TAG} %B%F{red}[LOGGING DISABLED]" zsh
}
if [ "${HISTFILE}" != '/dev/null' ]; then
# history
export HISTFILE="${HOME}/.zsh/history"
export HISTSIZE="4096"
export SAVEHIST="4096"
# Don't overwrite, append!
setopt APPEND_HISTORY
# Write after each command
# setopt INC_APPEND_HISTORY
# Killer: share history between multiple shells
setopt SHARE_HISTORY
# If I type cd and then cd again, only save the last one
setopt HIST_IGNORE_DUPS
# Even if there are commands inbetween commands that are the same, still only save the last one
setopt HIST_IGNORE_ALL_DUPS
# Pretty Obvious. Right?
setopt HIST_REDUCE_BLANKS
# If a line starts with a space, don't save it.
setopt HIST_IGNORE_SPACE
setopt HIST_NO_STORE
# When using a hist thing, make a newline show the change before executing it.
setopt HIST_VERIFY
# Save the time and how long a command ran
setopt EXTENDED_HISTORY
setopt HIST_SAVE_NO_DUPS
setopt HIST_EXPIRE_DUPS_FIRST
setopt HIST_FIND_NO_DUPS
fi
자동 완성 및 파일 이름 수정 보정을 켤 수 있다면! 아마도 가장 많은 시간을 절약 할 수있는 두 가지 일 것입니다. 그런 다음 사용법을 배우십시오-Bash와 Zsh에는 탭 완성 기능이 있습니다. Ksh에는 비효율적 인 이스케이프 백 슬래시가 있으므로 Ksh를 사용하지 않는 것이 좋습니다.
Zsh를 사용하지만 이와 같은 별칭은 Csh를 제외한 거의 모든 셸에서 작동합니다.
alias l='ls -FC --color=tty'
alias ls='ls -FC --color=tty'
alias h=history
alias m=more
alias vi=vim
alias cx='chmod +x'
'ps'의 별칭이 있어야하는 것처럼 보이지만 다양한 방법으로 'ps'를 사용하고 있으며 지금까지 아무것도 찾지 못했습니다.
Zsh에서 RPROMPT (오타가 아님) 변수를 설정하십시오.
RPROMPT='%d'
전체 디렉토리가 명령 줄 의 오른쪽 에 나타나고 잘라서 붙여 넣기 준비가됩니다. 나중에 더 자세히.
여러 vim-windows를 파일로 만드는 기능과 여러 버퍼로 인해 올바르게 컴파일 된 최신 Vim을 사용해야합니다. .vimrc는 다음과 같은 것을 가질 수 있습니다.
set mouse=c
set ml
set mls=5
set nowrap
set nobackup
set nonu
set showmatch
set tabstop=4
set shiftwidth=4
set showmode
set showcmd
set ruler
set notextauto
set laststatus=2
set mps=(:),{:},[:],<:>
set modelines=0
많은 것들이 개인적인 취향이지만 8 칸 탭은 코드를 읽을 수 없게 만들고 그것을 증명하기 위해 떠 다니는 연구가 있다고 생각합니다.
또한 "mouse = c"가 중요합니다. 마우스를 사용하여 파일 내부를 이동해서는 안됩니다. 키보드에서 손을 떼고 마우스를 만지면 다시 움직입니다. "hjkl"커서 이동 및 기타 키보드 페이징 및 커서 이동 키를 사용하십시오.
X11을 사용하는 경우 Xterm 구성에 몇 가지 작업을 수행해야합니다. 이것은 내 .Xresources 파일에서 나옵니다.
XTerm*VT100.scrollBar: true
XTerm*VT100.saveLines: 1000
XTerm*VT100.cutNewLine: false
XTerm*VT100.cutToBeginningOfLine: false
XTerm*VT100.charClass: 33:48,35:48,37:48,42:48,45-47:48,64:48,95:48,126:48
XTerm*VT100*translations: #override \n\
<Key>F2: insert-selection(PRIMARY,CUT_BUFFER0)
기본적으로 Xterm에 스크롤 막대를 제공하고 버퍼에 1000 줄의 텍스트를 저장하십시오. 이는 꽤 표준입니다.
charClass 지시어는 ".", '/'및 '*'와 같은 것을 "단어"로 만듭니다. '/'으로 구분 된 파일 이름의 일부를 두 번 클릭하면 ':'문자를 제외한 모든 것이 나타납니다.
cutToBeginningOfLine은 위의 Zsh RPROMPT에서 작동합니다. 명령 행의 RHS에 나타나는 현재 작업 디렉토리의 경로를 세 번 클릭하면 경로 만 선택합니다. 사본은 단어의 시작 부분에서 멈 춥니 다. 익숙해지면 매우 효율적입니다.
위의 X 리소스는 또한 붙여 넣기 키로 만듭니다. 이렇게하면 (마우스를 사용하여) 복사 한 후에는 마우스로 손을 움직이지 않고 붙여 넣어 클릭 할 수 있습니다.
Esc``Esc
또는 Esc``=
에 ksh
있으며에서 Tab
작동합니다 ksh93
. 누군가가 붙어 있거나 선호하는 경우를 대비하여.
마지막 명령의 0이 아닌 반환 값을 추가하는 것이 좋습니다. 원래 포스터는 .profile / .cshrc / .bashrc에 대해 구체적으로 묻는 것 같습니다. 일반적으로 사용자 정의 된 다른 RC 파일 목록을 언급 할 가치가 있지만이 질문에 대한 쉘 사용자 정의 만 고수합니다.
또한 최근에 쉘이 화면에서 실행될 때 표시되는 플래그를 프롬프트에 추가했습니다. 상위 프로세스를 검색하기 위해 solaris "ptree"명령을 사용하지만 Linux에서 "pstree"명령을 사용하여 동일한 작업을 수행 할 수 있습니다.
SCREEN=""
if [ -f /usr/bin/ptree ]; then
if ptree $$ | grep -v grep | grep -w screen > /dev/null 2>&1; then
SCREEN="SCREEN "
fi
fi
마지막 명령의 리턴 코드를 포함시키는 방법을 알아내는 데 몇 분이 걸렸으므로 여기에 게시하겠습니다.
PROMPT_COMMAND='if [ "$?" = 0 ]; \
then RC=""; \
else RC="RV=$? "; fi; PS1="% ${SCREEN}\h $RC\w\n% "'
나는 그것이 더 아름답게 될 수 있다고 확신합니다. :-)
향후 팁, $를 읽는 데주의해야합니까? "if ["를 사용한 후. 왼쪽 대괄호가 내장되어 있으면 $? 값을 대체하지 않습니다. 그러나 [가 내장되어 있지 않은 쉘을 사용하면 $ 값이 재설정됩니까? 테스트 후. $를 할당하는 것이 더 안전합니까? 임시 변수에 바로 넣은 다음 해당 변수를 테스트하십시오.
가장 최근에 변경된 파일 표시
종종 가장 최근 파일을보고 싶습니다. 예를 들어, logs 디렉토리에있을 수 있으며 어떤 파일이 왜 작동하지 않는지 가장 먼저 확인하기 때문에 가장 최근 파일을 확인하려고합니다.
ls -lt | head
입력하기가 번거롭기 때문에 다음과 같은 대안이 있습니다.
# show the most recently changed file
latest()
{
if test $# -ne 0
then
/bin/ls -t -1 -d "$@" | head -n 1
else
/bin/ls -t -1 -d * | head -n 1
fi
}
또한 와일드 카드 또는 파일 목록이 필요합니다 (예 :
$ latest mail* syslog*
syslog
모든 로그 파일의 이름이 타임 스탬프 인 경우 특히 유용합니다. 타임 스탬프의 형식을 걱정하지 않고 해당 프로그램의 최신 로그를 찾을 수 있습니다.
$ touch -d 'Feb 1' mylog.20110201
$ touch -d 'Feb 2' mylog.20110202
$ touch -d 'Feb 3' mylog.20110203
$ latest mylog*
mylog.20110203
다음 은 한 줄 대신 -<number>
인쇄 하는 옵션을 지원하는 확장 버전입니다 <number>
.
# show the most recently changed file
latest()
{
local count=1 # how many files to print
local promptlines=5 # how many lines to leave for the prompt
# when printing a screenful with -s
local usage="Usage: latest [-n <number>] [-s] [--] [pattern]"
while test $# -gt 0
do
case $1 in
# -- = stop processing options
--)
shift
break
;;
# -n <number> = <number> files
-n)
if test -n "$2"
then
count=$2
shift 2
else
echo "$usage" 1>&2
return 1
fi
;;
# -s = one screenful
-s)
count=$((LINES - promptlines))
shift
;;
# -<number> = <number> files
-[0-9]*)
count=${1#-}
shift
;;
# anything else starting with a minus is a usage error
-*)
echo "$usage" 1>&2
return 1
;;
*)
break
;;
esac
done
if test $# -ne 0
then
/bin/ls -t -1 -d "$@" | head -n $count
else
/bin/ls -t -1 -d * | head -n $count
fi
}