私たちは皆<ctrl>-R
、履歴を逆検索する方法を知っていますが、設定する<ctrl>-S
と順方向検索に使用できることを知っていましたstty stop ""
か?また、bind -pを実行して、すべてのキーボードショートカットを一覧表示したことがありますか?Mac OS Xには、デフォルトで455以上あります。
bashを使用した最もお気に入りの1つのあいまいなトリック、キーボードショートカット、またはショップ構成は何ですか?
私たちは皆<ctrl>-R
、履歴を逆検索する方法を知っていますが、設定する<ctrl>-S
と順方向検索に使用できることを知っていましたstty stop ""
か?また、bind -pを実行して、すべてのキーボードショートカットを一覧表示したことがありますか?Mac OS Xには、デフォルトで455以上あります。
bashを使用した最もお気に入りの1つのあいまいなトリック、キーボードショートカット、またはショップ構成は何ですか?
回答:
サフィックスのあるファイルの名前を変更/移動する:
cp /home/foo/realllylongname.cpp{,-old}
これは次のように拡張されます。
cp /home/foo/realllylongname.cpp /home/foo/realllylongname.cpp-old
別のお気に入り:
!!
最後のコマンドを繰り返します。次の形式で最も役立ちます:
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」の1つのインスタンスを置き換えるだけではなく、より正確な応答になります!!: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番目の引数」に一般化することもできます。
$ 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を使用する代わりに、ファイルのリストに対して一連のコマンドを実行する必要がある場合は、1行のループを解除します。
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
私がするもう1つのことは、私の歴史の一部のコマンドを無視することです。exitコマンドを覚えておく必要はありません。
export HISTIGNORE="&:[ ]*:exit"
あなたは間違いなくhistappendを設定したいです。そうでない場合、bashは終了時に履歴を上書きします。
shopt -s histappend
私が使用する別のオプションはcmdhistです。これにより、複数行のコマンドを1つのコマンドとして履歴に保存できます。
shopt -s cmdhist
最後に、Mac OS X(viモードを使用していない場合)では、<CTRL> -Sをスクロール停止からリセットする必要があります。これにより、bashがそれを前方検索として解釈できなくなります。
stty stop ""
現在のサブディレクトリのみを一覧表示するにはどうすればよいですか?
ls -d */
それは簡単なトリックですが、それを見つけるのにどれだけの時間が必要だったかはわかりません。
alias lsd='ls -F | grep --color /'
ものは、同じことをリストしますが、より下品な方法でした。ただし、解析を簡単にするために、1行に1つのディレクトリがリストされます。同じことを行うようにコマンドを変更しました:ls -d1 */
ESC.
最後のbashコマンドから最後の引数を挿入します。思った以上に重宝します。
cp file /to/some/long/path
CD ESC.
確かに " 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 -bart -simpson -ruls
。S、ICNR
ls -lort
デンマーク語では、デンマーク語の「たわごと」を使用できます。グループを省略し、ヴァルハルの怒りを得ない:)
もっと目新しさがありますが、賢い...
使用される上位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を押します。そうすれば、履歴に残っている最近使用したコマンドを覚えておく必要はありません。bashだけでなく、行末を表す^ E、行頭を表す^ A、カーソルの前後をそれぞれ削除する^ Uおよび^ K。
私はしばしばviやlsなどのエイリアスを持っていますが、エイリアスをエスケープしたい場合があります。前のコマンドにバックスラッシュを追加するだけです:
例えば:
$ alias vi=vim
$ # To escape the alias for vi:
$ \vi # This doesn't open VIM
かっこいいですね。
command
。BashのSHELL BUILTIN COMMANDS
マニュアルを参照してください。
次に、いくつかの構成の微調整を示します。
~/.inputrc
:
"\C-[[A": history-search-backward
"\C-[[B": history-search-forward
これは同じように機能し^R
ますが、代わりに矢印キーを使用します。これは、(たとえば)入力してcd /media/
から上向き矢印を押して、最後に入力したものに移動できることを意味cd
します/media/
フォルダーます。
(私はGnomeターミナルを使用しています。他のターミナルエミュレータのエスケープコードを変更する必要があるかもしれません。)
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
私は次のものをたくさん使います:
:p
修飾子は、履歴結果を印刷します。例えば
!!:p
最後のコマンドを出力して、もう一度実行する前に、コマンドが正しいことを確認できるようにします。入力するだけ!!
して実行してください。
同じような調子で:
!?foo?:p
文字列 'foo'を含む最新のコマンドの履歴を検索して出力します。
印刷する必要がない場合は、
!?foo
検索を実行してすぐに実行します。
bind Space:magic-space # !pin<space>
私は秘密の武器を持っています: shell-fu。
何千ものスマートなヒント、クールなトリック、効率的なレシピがあり、ほとんどの場合1つの行に収まります。
私が大好きなもの(ただし、現在ほとんどのUnixシステムにPythonがインストールされているという事実を利用しているので、私は少しごまかしています):
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
それがあなたの複数の場所にある場合、それはそれらのそれぞれを表示します。
私はエコーでコマンドを作成し、それらをシェルにパイプするのが好きです:
$ 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
そして、私が終わったとき(またはls
ゼロ以外の値が返されたとき)には、ctrl + cを押します。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はポートでもリッスンできますか?
ツリー階層内の大きく離れた場所で複数のディレクトリを使用している場合の好ましいナビゲーション方法の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
$ echo !$ !-2^ *
Alt+ Ctrl+ e
$ echo aword someotherword *
Ctrl+ _
$ echo !$ !-2^ *
Ctrl+ x、*
$echo !$ !-2^ LOG Makefile bar.c foo.h
&c。
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
ますが、emacsユーザーではありません。
$ 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