履歴を逆検索する方法は誰もが知っていますが、設定すると転送検索に<ctrl>-R
使用できることをご存知ですか?また、bind -pを実行して、リストされているすべてのキーボードショートカットを表示しようとしたことがありますか?MacOSXにはデフォルトで455以上あります。 <ctrl>-S
stty stop ""
bashを使用した、最もお気に入りのあいまいなトリック、キーボードショートカット、またはショップの構成は何ですか?
履歴を逆検索する方法は誰もが知っていますが、設定すると転送検索に<ctrl>-R
使用できることをご存知ですか?また、bind -pを実行して、リストされているすべてのキーボードショートカットを表示しようとしたことがありますか?MacOSXにはデフォルトで455以上あります。 <ctrl>-S
stty stop ""
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
を編集したい場合に便利です。次のように「th 引数」に一般化することもできます。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
コマンドを実行するときに、前の引数を使用してコマンドを実行したい場合があります。これを行うには、次のショートカットを使用できます。
$ mkdir /tmp/new
$ cd !!:*
場合によっては、findを使用する代わりに、ファイルのリストに対して一連のコマンドを実行する必要がある場合に、1行のループを分割します。
for file in *.wav; do lame "$file" "$(basename "$file" .wav).mp3" ; done;
.bash_login(または.bashrc)でコマンドライン履歴オプションを構成すると非常に便利です。以下は、MacbookProで使用する設定の幹部です。
以下を設定すると、bashは履歴内の重複コマンドを消去します。
export HISTCONTROL="erasedups:ignoreboth"
また、履歴サイズをかなり大きくします。なぜだめですか?今日のマイクロプロセッサでは何も遅くならないようです。
export HISTFILESIZE=500000
export HISTSIZE=100000
私がするもう一つのことは、私の歴史からいくつかのコマンドを無視することです。終了コマンドを覚えておく必要はありません。
export HISTIGNORE="&:[ ]*:exit"
あなたは間違いなくhistappendを設定したいです。それ以外の場合、bashは終了時に履歴を上書きします。
shopt -s histappend
私が使用する別のオプションはcmdhistです。これにより、複数行のコマンドを1つのコマンドとして履歴に保存できます。
shopt -s cmdhist
最後に、Mac OS X(viモードを使用していない場合)では、<CTRL>-Sをスクロール停止からリセットする必要があります。これにより、bashがそれを前方検索として解釈できなくなります。
stty stop ""
現在のサブディレクトリのみを一覧表示するには?
ls -d */
これは単純なトリックですが、それを見つけるのにどれだけの時間が必要だったかはわかりません。
ESC.
最後のbashコマンドから最後の引数を挿入します。思った以上に重宝します。
cp file /to/some/long/path
CDESC.
確かにできますが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
$
別の例として、2 つのサーバーに同じ 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
$
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 を押します。そうすれば、履歴に残っている最近使用したコマンドを覚える必要がなくなります。bash だけでなく、^E は行末、^A は行頭、^U と ^K はそれぞれカーソルの前後を削除します。
私はvi、lsなどのエイリアスをよく持っていますが、エイリアスをエスケープしたい場合があります。前のコマンドにバックスラッシュを追加するだけです。
例えば:
$ alias vi=vim
$ # To escape the alias for vi:
$ \vi # This doesn't open VIM
かっこいいですね。
私は以下をよく使います:
:p
履歴結果を出力する修飾子。例えば
!!:p
最後のコマンドを出力するので、再度実行する前にコマンドが正しいことを確認できます。入力!!
するだけで実行できます。
同じような調子で:
!?foo?:p
文字列「foo」を含む最新のコマンドの履歴を検索して出力します。
印刷する必要がない場合は、
!?foo
検索を実行し、すぐに実行します。
ここでは、構成の微調整をいくつか示します。
~/.inputrc
:
"\C-[[A": history-search-backward
"\C-[[B": history-search-forward
これは同じように機能し^R
ますが、代わりに矢印キーを使用します。つまり、(eg) と入力してから上矢印キーを押すと、フォルダー内でcd /media/
最後に行った場所に移動できます。cd
/media/
(私は Gnome ターミナルを使用しています。他のターミナル エミュレータのエスケープ コードを変更する必要があるかもしれません。)
Bash 補完も信じられないほど便利ですが、それははるかに微妙な追加です。で~/.bashrc
:
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
これにより、プログラムごとのタブ補完が有効になります (たとえば、コマンド ラインが で始まるときにタブ補完を試みるとevince
、開くことができるファイルのみが表示され、タブ補完のコマンド ライン オプションも表示されます)。
これでうまく動作します~/.inputrc
:
set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on
私は秘密兵器を持っています: shell-fu.
ほとんどの場合、1行に収まる賢いヒント、クールなトリック、効率的なレシピが何千もあります.
私が大好きなもの (ただし、現在ほとんどの 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 のどこかにあります。
私はechoでコマンドを作成し、それらをシェルにパイプするのが好きです:
$ find dir -name \*~ | xargs echo rm
...
$ find dir -name \*~ | xargs echo rm | ksh -s
なんで?実行する前に何が実行されるかを確認できるからです。そうすれば、恐ろしいエラー (ホーム ディレクトリの削除など) が発生した場合でも、発生する前にキャッチできます。明らかに、これは破壊的または取り返しのつかないアクションにとって最も重要です。
pushd
ほとんどの場合、popd
便利です
ツリー階層内の大きく離れた場所で複数のディレクトリを使用している場合にナビゲートする1つの好ましい方法は、acf_func.sh(以下にリスト)を使用することです。定義したら、次のことができます
CD -
数値メニューで最近のディレクトリのリストを表示するには
cd -2
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
大きなファイルをダウンロードするとき、私はよくします:
while ls -la <filename>; do sleep 5; done
そして、完了したら(または、ls
ゼロ以外を返す場合は)ctrl+cを実行します。プログラムに似てwatch
いますが、代わりにシェルを使用するため、がないプラットフォームで動作しますwatch
。
もう1つの便利なツールはnetcat、またはnc
です。もし、するなら:
nc -l -p 9100 > printjob.prn
次に、別のコンピューターにプリンターをセットアップできますが、代わりにnetcatを実行しているコンピューターのIPアドレスを使用します。印刷ジョブが送信されると、netcatを実行しているコンピューターによって受信され、にダンプされprintjob.prn
ます。
$ echo !$ !-2^ *
Alt+ Ctrl+ e
$ echo aword someotherword *
Ctrl+ _
$ echo !$ !-2^ *
Ctrl+ x, *
$echo !$ !-2^ LOG Makefile bar.c foo.h
&c。
私はいつも以下に偏っています:
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
コマンドラインから「set-ovi」を使用するか、.bashrcを使用すると、コマンドラインでvi編集モードになります。「挿入」モードで開始するため、通常どおり入力してバックスペースキーを使用できますが、「大きな」間違いを犯した場合は、escキーを押してから、viの場合と同じように「b」と「f」を使用して移動できます。単語を変更するにはcw。変更したい履歴コマンドを表示した後に特に役立ちます。
String multiple commands together using the && command:
./run.sh && tail -f log.txt
or
kill -9 1111 && ./start.sh
重複ファイルファインダー
これにより、現在のディレクトリからチェックサムが再帰的に実行され、すべての同一のチェックサム結果のファイル名が返されます。
find ./ -type f -print0 | xargs -0 -n1 md5sum | sort -k 1,32 | uniq -w 32 -d --all-repeated=separate | sed -e 's/^[0-9a-f]*\ *//;'
もちろん、パスを変更することもできます。
多分それを関数またはエイリアスに入れて、パラメータとしてターゲットパスを渡します。
$ 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
上記の多くと同様に、私の現在のお気に入りはキーストローク [alt] です。(Alt キーと "." キーを一緒に) これは $! と同じです。(前のコマンドの最後の引数を挿入します)ただし、それは即時であり、私にとっては入力が簡単です。(スクリプトでは使用できません)
例えば:
mkdir -p /tmp/test/blah/oops/something
cd [alt].
!
<コマンドの最初の数文字> は、一致する最後のコマンドを実行します。
例:
!b
「なんでもビルド -O -p -t -i -on」
!.
が実行されます./a.out
コンパイル、ビルド、実行などの長くて反復的なコマンドで最もうまく機能します。コーディングとテストの時間を大幅に節約できました。
すばやくアクセスしたいディレクトリがたくさんあります。CDPATH
変数は、ワークフローを大幅に高速化するソリューションです。
export CDPATH=.:/home/gadolin/sth:/home/gadolin/dir1/importantDir
これで、フルパスを提供するかどうかに関係なく、cd
サブディレクトリのいずれかにジャンプできます。そして、私がそこにいるのと同じように、ここでも機能します! したがって、ディレクトリがある場合は、どこにでも入力すると、そこにいます。/home/gadolin/sth
/home/gadolin/dir1/importantDir
<tab>
/home/gadolin/sth/1
/home/gadolin/sth/2
cd 1
重要なファイルを除く すべてを削除します:
# shopt -s extglob
# rm -rf !(important-file)
zshでも同じです:
# rm -rf *~important-file
重要なフィールドを別の辞書に移動し、すべてを削除して、重要なフィールドを元に戻す必要があることを知っていました。
Ctrl+Lは通常、画面をクリアします。Bashプロンプト(明らかに)とGDB、および他の多くのプロンプトから機能します。
以下を bash ターミナル ウィンドウに貼り付けることができるはずです。
ANSI カラー パレットを表示します。
e="\033["
for f in 0 7 `seq 6`; do
no="" bo=""
for b in n 7 0 `seq 6`; do
co="3$f"; p=" "
[ $b = n ] || { co="$co;4$b";p=""; }
no="${no}${e}${co}m ${p}${co} ${e}0m"
bo="${bo}${e}1;${co}m ${p}1;${co} ${e}0m"
done
echo -e "$no\n$bo"
done
256 色のデモ:
yes "$(seq 232 255;seq 254 -1 233)" |
while read i; do printf "\x1b[48;5;${i}m\n"; sleep .01; done
履歴置換文字を使用して、、 など!#
と組み合わせて現在のコマンド ラインにアクセスします。^
$
たとえば、"old-" プレフィックスを付けて邪魔にならない場所にファイルを移動します。
mv file-with-long-name-typed-with-tab-completion.txt old-!#^
さて、これは少し話題から外れているかもしれませんが、あなたがEmacsユーザーなら、「emacs」が最も強力なトリックだと思います...これに反対する前に、emacsインスタンス内で「Mxshell」を試してください... emacs内にシェルを取得し、シェルのパワーとともにemacsのすべてのパワーを持ちます(その中に別のemacsを開くなど、いくつかの制限がありますが、ほとんどの場合、バニラバッシュプロンプトよりもはるかに強力です)。
プロンプトの色のスプラッシュが好きです:
export PS1="\[\033[07;31m\] \h \[\033[47;30m\] \W \[\033[00;31m\] \$ \[\e[m\]"
私はそれがどのように見えるかのスクリーンショットを持っていないのではないかと思いますが、それは次のようなものになるはずです(すべて1行に):
[RED BACK WHITE TEXT] Computer name
[BLACK BACK WHITE TEXT] Working Directory
[WHITE BACK RED TEXT] $
あなたが見たいものに従ってカスタマイズ:)
間違った行を入力したことに気付いたときに行う簡単な方法は、Ctrl+C を押すことです。行を保持したいが、最初に何か他のことを実行する必要がある場合は、新しい行をバック スラッシュ (\) で開始し、次に Ctrl+C を押します。行は履歴に残ります。
後方検索のための CTRL-r の拡張機能として、'history-search-backward' をバインドすると、現在の入力を履歴でオートコンプリートできます。通常、tcsh にあるのと同じキーにバインドします: ESC-p. これを行うには、.inputrc ファイルに次の行を追加します。
"\M-p": history-search-backward
たとえば、以前に「make some_really_painfully_long_target」を実行したことがある場合は、次のように入力できます。
> make <ESC p>
そしてそれはあなたに与えるでしょう
> make some_really_painfully_long_target
前の行を挿入 最終パラメータ
ALT-. これまでで最も便利なキーの組み合わせです。試してみてください。何らかの理由で誰もこれについて知りません。
何度も押して、古い最後のパラメータを選択します。
ほんの少し前に使用したものに別のことをしたい場合に最適です。
中かっこ展開:
./configure
多くのオプションを指定してa を実行する場合、非常に便利です。
./configure --{prefix=/usr,mandir=/usr/man,{,sh}libdir=/usr/lib64,\
enable-{gpl,pthreads,bzlib,lib{faad{,bin},mp3lame,schroedinger,speex,theora,vorbis,xvid,x264},\
pic,shared,postproc,avfilter{-lavf,}},disable-static}
これは文字通り、私の ffmpeg の構成設定です。中括弧なしでは 409 文字です。
または、さらに良い:
echo "I can count to a thousand!" ...{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}...
エイリアスにさまざまな誤植があります
alias mkae=make
alias mroe=less
エイリアスを使用すると時間を節約できます
alias myDir = "cd /this/is/a/long/directory; pwd"
それほど曖昧ではありませんが、私が絶対に気に入っている機能の1つは、タブ補完です。
サブツリー構造全体をナビゲートしている場合、またはあいまいなコマンドや長いコマンドを使用している場合に非常に便利です。
The easiest keystrokes for me for "last argument of the last command" is !$
echo what the heck?
what the heck?
echo !$
heck?
$_
(ドルの下線): 前のコマンドの最後の単語。!$
のように履歴に置換を入れないことを除いて、同様!$
です。
SSH トンネル:
ssh -fNR 1234:localhost:22 root@123.123.123.123
私のお気に入りではありません。コピーと貼り付けを使用して他の回答を試している場合は非常に役立ちます。
function $
{
"$@"
}
$
これで、各行の先頭にプロンプトを含む例を貼り付けることができます。
alias ..='cd ..'
したがって、ディレクトリをナビゲートするときは、単に使用します..<Enter>
CTRL+Dはシェルを終了します。
私は Bashジョブ コントロールの大ファンです。特に端末で開発を行っている場合は、主に と を使用しControl-Z
ます。fg
emacs を開いていて、コンパイルやデプロイなどをControl-Z
行う必要がある場合は、emacs を一時停止し、必要なことを行い、fg
元に戻すだけです。これにより、すべての emacs バッファーがそのまま保持され、何を行っていても再起動するよりもはるかに簡単になります。
これにより、ファイルの最後で画面がクリアされるのを防ぐことができます。
export LESS="-X"
私はMacでのプログラミングに不慣れで、bashからGUIプログラムを起動できないので、次のような関数を作成する必要があります。
function macvim
{
/Applications/MacVim.app/Contents/MacOS/Vim "$@" -gp &
}
<何でも>| 並べ替え| uniq -c | 並べ替え-n
<anything>のすべての異なる発生のカウントを提供します。
多くの場合、awk、sed、またはcutは、<anything>のデータの解析に役立ちます。
いくつかのBashナゲットもここにあります:
du -a | 並べ替え-n| テール-99
大きなファイル(またはファイルのディレクトリ)を見つけてクリーンアップし、ディスク領域を解放します。
bashは、TCP/IPソケットとの間でリダイレクトできます。/ dev /tcp/および/dev/udp。
これはセキュリティの問題だと考える人もいますが、それがSolarisXの刑務所のようなOSレベルのセキュリティの目的です。
Will Robertsonが指摘しているように、プロンプトを変更して処理を実行します...コマンド#for!nnを出力します。Xtermターミナル名を設定します。トラフィックをスニッフィングしてタイトルを設定しない古いXtermの場合。
2 つの別々のディレクトリ間を移動し、ファイルを前後にコピーするときは、次のようにします。
cd /some/where/long
src=`pwd`
cd /other/where/long
dest=`pwd`
cp $src/foo $dest
command completion will work by expanding the variable, so you can use tab completion to specify a file you're working with.
sudo !!
管理者権限で最後のコマンドを実行します。
インタラクティブなシェル トリックではありませんが、優れたスクリプトを作成するためのトリックとして有効です。
getopts、シフト、$OPTIND、$OPTARG:
カスタマイズ可能なスクリプトを作成するのが大好きです。
while getopts 'vo:' flag; do
case "$flag" in
'v')
VERBOSE=1
;;
'o')
OUT="$OPTARG"
;;
esac
done
shift "$((OPTIND-1))"
xargs(1):
私はトリプルコア プロセッサを使用しており、一連のファイルに対して圧縮やその他の CPU 集中型のシリアル操作を実行するスクリプトを実行するのが好きです。xargs
ジョブキューとして使用して高速化するのが好きです。
if [ "$#" -gt 1 ]; then
# schedule using xargs
(for file; do
echo -n "$file"
echo -ne '\0'
done) |xargs -0 -n 1 -P "$NUM_JOBS" -- "$0"
else
# do the actual processing
fi
これは のように機能しmake -j [NUM_JOBS]
ます。
ctrl-u 書かれたものをすべて削除
そして、これは実際に私にとって重要です:
set -o vi
/アラン
拡張グロビング:
rm !(foo|bar)
or*
なしのように展開します:foo
bar
$ ls
foo
bar
foobar
FOO
$ echo !(foo|bar)
foobar FOO
私はいつもこれが好きでした。これを /etc/inputrc または ~/.inputrc に追加します
"\e[A":history-search-backward "\e[B":history-search-forward
入力ls <up-arrow>
すると、「ls」で始まる最後のコマンドまたは入力したその他のコマンドに置き換えられます。
私のお気に入りの bash のトリックの 1 つは、「tar パイプ」です。あるディレクトリから別のディレクトリにコピーする膨大な量のファイルがある場合、「cp * /an/other/dir」を実行しても、ファイル数が多すぎて bash グロバーが爆発すると機能せず、tar パイプが:
(cd /path/to/source/dir/ ; tar cf - * ) | (cd /path/to/destination/ ; tar xf - )
...そして、netcat があれば、ネットワーク経由で "netcat tar パイプ" を実行することもできます !!
Shell-fuは、コマンド ラインのヒントやコツを保存、モデレート、および伝達するための場所です。StackOverflow に少し似ていますが、シェル専用です。この質問に対する答えはたくさんあります。
ログ ファイルの最後の数行を取得したいですか。
tail /var/log/syslog
ログ ファイルがいつ変更されるかを監視したいですか。
tail -f /var/log/syslog
ファイルを最初からすばやく読みたいですか?
more /var/log/syslog
ファイルにテキストが含まれているかどうかをすばやく確認したいですか?
grep "find this text" /var/log/syslog
while IFS= read -r line; do
echo "$line"
done < somefile.txt
これは、ファイルを 1 行ずつ処理するのに適した方法です。行の先頭または末尾にある空白文字を取得するには、IFS をクリアする必要があります。バックスラッシュを含むすべての生の文字を取得するには、「-r」が必要です。
再び上位 10 コマンド ( ctcherryの投稿のように、短いだけ):
history | awk '{ print $2 }' | sort | uniq -c |sort -rn | head
まったくのユーモア要素として、空のファイル「myself」を作成してから、次のようにします。$ touch myself
数年前、p*コマンドを発見したり、プロセスに関する情報を取得したりしました: ptree、pgrep、pkill、およびpfiles。もちろん、それらすべての母体はpsですが、高負荷下での出力を理解するには 、出力をless、grep、および/またはawkにパイプする必要があります。トップ(およびバリアント)も役立ちます。
私は本当にばかげていますが、深いツリー構造をナビゲートするときに非常に役立つものを持っています。これを .bashrc (または同様のもの) に入れます。
alias cd6="cd ../../../../../.."
alias cd5="cd ../../../../.."
alias cd4="cd ../../../.."
alias cd3="cd ../../.."
alias cd2="cd ../.."
シンボリックリンクを含むディレクトリの正確な再帰コピー/バックアップを作成するのに適しています(シンボリックリンクをたどったり、cpのように無視したりするのではなく):
$ mkdir new_dir
$ cd old_dir
$ tar cf - . | ( cd ../old_dir; tar xf - )
他の誰かが Emacs で "Mx shell RET" を勧めました。「Mx eshell RET」はもっといいと思います。
Mac OS X では、
ESC .
最近の引数を順番に循環します。つまりESC
、 を押して放し、次に.
(ピリオド キー) を押して放します。Ubuntuでは、ALT+.
.
これを複数回実行して、最近のすべての議論に戻ることができます。CTRL+に似Rていますが、引数のみです。また、実際にコマンドを実行する前に何が得られるかがわかるため、 !!
orよりもはるかに安全です。$!
クイックテキスト
私はこれらの一連のテキストを頻繁に使用するので、それらへのショートカットを次のように配置します.inputrc
。
# redirection short cuts
"\ew": "2>&1"
"\eq": "&>/dev/null &"
"\e\C-q": "2>/dev/null"
"\eg": "&>~/.garbage.out &"
"\e\C-g": "2>~/.garbage.out"
$if term=xterm
"\M-w": "2>&1"
"\M-q": "&>/dev/null &"
"\M-\C-q": "2>/dev/null"
"\M-g": "&>~/.garbage.out &"
"\M-\C-g": "2>~/.garbage.out"
$endif
プログラム可能な完了:
派手なものはありません。Knoppix を使用しているときは、頻繁に邪魔になるため、常に無効にしています。いくつかの基本的なもの:
shopt -s progcomp
complete -A stopped -P '%' bg
complete -A job -P '%' fg jobs disown wait
complete -A variable readonly export
complete -A variable -A function unset
complete -A setopt set
complete -A shopt shopt
complete -A helptopic help
complete -A alias alias unalias
complete -A binding bind
complete -A command type which \
killall pidof
complete -A builtin builtin
complete -A disabled enable
FIGNORE 環境変数は、TAB 補完で特定のサフィックスを持つファイルまたはフォルダーを無視する場合に便利です。たとえば、次のようになります。
export FIGNORE="CVS:.svn:~"
スペース以外の項目セパレーターを定義する場合は、IFS 環境変数を使用します。たとえば、次のようになります。
export IFS="
"
これにより、次のように、魔法を実行せずに、スペースを含むファイルとフォルダーをループできるようになります。
$ touch "with spaces" withoutspaces
$ for i in `ls *`; do echo $i; done
with
spaces
withoutspaces
$ IFS="
"
$ for i in `ls *`; do echo $i; done
with spaces
withoutspaces
GNU/Linux の pbcopy および pbpaste エイリアス
alias pbcopy='xclip -selection clipboard'
alias pbpaste='xclip -selection clipboard -o'
私は常にfor i in $(ls)
ステートメントが必要なので、ショートカットを作成しました:
fea(){
if test -z ${2:0:1}; then action=echo; else action=$2; fi
for i in $(ls $1);
do $action $i ;
done;
}
もう1つは次のとおりです。
echo ${!B*}
「B」で始まるすべての定義済み変数のリストを出力します。
シグナルトラップ:
シェル プロセスに送信されたシグナルをトラップし、コマンド ラインで入力したかのように、それぞれの環境でサイレントにコマンドを実行させることができます。
# TERM or QUIT probably means the system is shutting down; make sure history is
# saved to $HISTFILE (does not do this by default)
trap 'logout' TERM QUIT
# save history when signalled by cron(1) script with USR1
trap 'history -a && history -n' USR1
私はviでmanページを読むのが好きなので、.profileまたは.bashrcファイルに次のようにあります。
man () {
sought=$*
/usr/bin/man $sought | col -b | vim -R -c "set nonumber" -c "set syntax=man" -
}
Macのみ。これは簡単ですが、MANは私がこの数年前に知っていたらよかったのにと思います。
open ./
Finderで現在のディレクトリを開きます。また、デフォルトのアプリケーションで任意のファイルを開くために使用することもできます。URLにも使用できますが、URLの前に。を付ける場合に限りますhttp://
。これにより、不定期のランダムサイトを開くためのユーティリティが制限されます。
私は常にデフォルトのプロンプトを「username@hostname:/ current / path / name / in/full>」に設定します
PS1='\u@\h:\w> '
export PS1
さまざまなマシンを扱うときに、多くの混乱を回避できます。
いくつかのオーディオおよびビデオ編集ツールを探しているときに私が見つけたいくつかの便利なmencoderコマンド:
.xxxから.aviへ
mencoder movie.wmv -o movie.avi -ovc lavc -oac lavc
ビデオからサウンドをダンプします。
mplayer -ao pcm -vo null -vc dummy -dumpaudio -dumpfile fileout.mp3 filein.avi
バッチ モード (-b) を使用してトップ コマンド出力をファイルにリダイレクトする方法について言及したいと思います。
$ top -b -n 1 > top.out.$(日付 +%s)
デフォルトでは、top はインタラクティブ モードを使用して呼び出されます。このモードでは、top は無期限に実行され、キー入力を受け入れて top の動作を再定義します。
私が書いた記事はここにあります
alias -- ddt='ls -trFld'
dt () { ddt --color "$@" | tail -n 30; }
現在のディレクトリ内の最新のファイルを提供します。私はいつもそれを使用しています...
カスタム タブ補完 (compgen および完全な bash ビルトイン)
タブ補完は素晴らしいですが、それをファイル名以外にも適用できるのは素晴らしいことです。これを使用してカスタム関数を作成し、引数を常に使用するコマンドに展開しました。たとえば、FQDN を引数としてコマンドに追加する必要がよくあるとします (例: ping blah.really.long.domain.name.foo.com
)。compgen と complete を使用して、/etc/hosts ファイルを読み取って結果を取得する bash 関数を作成できます。入力する必要があるのは次のとおりです。
ping blah.<tab>
現在のすべてのマッチ オプションが表示されます。
したがって、基本的に単語リストを返すことができるものはすべて関数として使用できます。
ディレクトリ内で何かを検索しているが、ファイルがわからない場合は、次の方法でディレクトリ内のファイルを grep します。
find . -exec grep whatIWantToFind {} \;
alias mycommand = 'verylongcommand -with -a -lot -of -parameters'
alias grep='grep --color'
grep で複数の単語を検索:
netstat -c |grep 'msn\|skype\|icq'
# Batch extension renamer (usage: renamer txt mkd)
renamer() {
local fn
for fn in *."$1"; do
mv "$fn" "${fn%.*}"."$2"
done
}
$PATH にあることがわかっているシェルスクリプトをすばやく編集できるようにするには (ls を使用しないでください...):
function viscr { vi $(which $*); }
簡単な計算機として、パーセンテージを計算するとします。
$ date
Thu Sep 18 12:55:33 EDT 2008
$ answers=60
$ curl "http://stackoverflow.com/questions/68372/what-are-some-of-your-favorite-command-line-tricks-using-bash" > tmp.html
$ words=`awk '/class="post-text"/ {s = s $0} \
> /<\/div>/ { gsub("<[^>]*>", "", s); print s; s = ""} \
> length(s) > 0 {s = s $0}' tmp.html \
> | awk '{n = n + NF} END {print n}'`
$ answers=`awk '/([0-9]+) Answers/ {sub("<h2>", "", $1); print $1}' tmp.html`
そして最後に:
$ echo $words words, $answers answers, $((words / $answers)) words per answer
4126 words, 60 answers, 68 words per answer
$
除算が切り捨てられたり、丸められたりするわけではありません。しかし、多くの場合、簡単な計算には十分です。
私のお気に入りの2つは次のとおりです。
1) タブ補完で大文字と小文字を区別しないようにします (たとえば、"cd /home/User " はコマンド ラインを "cd /home/user" に変換します) 後者が存在し、前者が存在しない場合。プロンプトで -ignore-case on" を入力するか、.inputrc ファイルに "set completion-ignore-case on" を追加して永続的に追加します。
2) 組み込みの「type」コマンドは「which」に似ていますが、エイリアスも認識します。例えば
$ type cdhome
cdhome is aliased to 'cd ~'
$ type bash
bash is /bin/bash
新しいディレクトリに変更し、ファイルを新しいディレクトリから古いディレクトリに移動したいと考えています。一手で:mv file $OLDPWD
Apropos history -- 不可解なキャレットなどを使用することは、完全に直感的ではありません。特定の文字列を含むすべての履歴項目を印刷するには:
function histgrep { fc -l -$((HISTSIZE-1)) | egrep "$@" ;}
検索を使用して、テキストに一致するファイルを見つける方法 | grep -H この例では、どの ruby ファイルにジャンプ文字列が含まれているか -
探す 。-name '*.rb' -exec grep -H jump {} \;
大量の出力 (大きな「make」など) を伴うコマンドを実行する場合、出力を保存するだけでなく、表示することも必要です。
make install 2>&1 | ティーイーメイク
xterm のウィンドウ タイトルに現在のディレクトリを表示するプロンプトを設定するのが好きです。また、時刻と現在のディレクトリも表示されます。さらに、バックグラウンド ジョブが終了したことを bash が報告する場合は、ANSI エスケープ シーケンスを使用して別の色で報告されます。私はブラック オン ライト コンソールを使用しているため、ライト オン ブラックを好む場合は、私の色が適切ではない可能性があります。
PROMPT_COMMAND='echo -e "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\007\033[1;31m${PWD/#$HOME/~}\033[1;34m"'
PS1='\[\e[1;31m\]\t \$ \[\e[0m\]'
プロンプト文字列が実際に画面に表示される時間を bash が認識できるように、PS1 文字列\[
で正しく使用する方法を理解していることを確認してください。\]
これは、1 行のコマンドを超えたときにコマンド ラインを正しく再描画できるようにするためです。
./mylittlealgorithm < 入力.txt > 出力.txt
find -iregex '.*\.py$\|.*\.xml$' | xargs egrep -niH 'a.search.pattern' | vi -R -
すべての Python ファイルとすべての XML ファイルでパターンを検索し、結果を読み取り専用のVimセッションにパイプします。