156

履歴を逆検索する方法は誰もが知っていますが、設定すると転送検索に<ctrl>-R使用できることをご存知ですか?また、bind -pを実行して、リストされているすべてのキーボードショートカットを表示しようとしたことがありますか?MacOSXにはデフォルトで455以上あります。 <ctrl>-Sstty stop ""

bashを使用した、最もお気に入りのあいまいなトリック、キーボードショートカット、またはショップの構成は何ですか?

4

105 に答える 105

156

サフィックス付きのファイルの名前変更/移動をすばやく行う:
cp /home/foo/realllylongname.cpp{,-old}

これは次のように展開されます。
cp /home/foo/realllylongname.cpp /home/foo/realllylongname.cpp-old

于 2008-09-16T01:38:33.607 に答える
149
cd -

これは、戻るボタンに相当するコマンドラインです(前のディレクトリに移動します)。

于 2008-09-16T01:01:43.710 に答える
135

別のお気に入り:

!!

最後のコマンドを繰り返します。次の形式で最も役立ちます。

sudo !!
于 2008-09-16T01:07:26.317 に答える
81

私のお気に入りは「^string^ string2」です。これは最後のコマンドを受け取り、stringをstring2に置き換えて実行します。

$ ehco foo bar baz
bash: ehco: command not found
$ ^ehco^echo
foo bar baz

Bashコマンドライン履歴ガイド

于 2008-09-16T06:17:29.863 に答える
64

名前を変更

例:

$ 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

とても便利

于 2008-09-16T01:06:54.400 に答える
60

私はと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
于 2008-09-16T01:19:53.947 に答える
47

コマンドを実行するときに、前の引数を使用してコマンドを実行したい場合があります。これを行うには、次のショートカットを使用できます。

$ 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 ""
于 2008-09-16T01:06:25.057 に答える
43

現在のサブディレクトリのみを一覧表示するには?

ls -d */

これは単純なトリックですが、それを見つけるのにどれだけの時間が必要だったかはわかりません。

于 2008-10-05T13:02:11.790 に答える
41

ESC.

最後のbashコマンドから最後の引数を挿入します。思った以上に重宝します。

cp file /to/some/long/path

CDESC.

于 2008-09-16T01:05:55.480 に答える
36

確かにできますが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 には、さらに多くの例があります。

于 2008-10-02T21:57:41.073 に答える
35

私のお気に入りのコマンドは「ls -thor」です

それは神の力を呼び起こし、最近変更されたファイルを読みやすい形式で一覧表示します。

于 2008-09-16T04:55:59.217 に答える
28

もっと目新しさですが、それは賢いです...

使用された上位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
于 2008-09-16T01:00:00.360 に答える
25

^R 逆検索。^R を押して、一致させたい前のコマンドの一部を入力し、目的のコマンドが見つかるまで ^R を押します。そうすれば、履歴に残っている最近使用したコマンドを覚える必要がなくなります。bash だけでなく、^E は行末、^A は行頭、^U と ^K はそれぞれカーソルの前後を削除します。

于 2008-09-16T01:33:13.230 に答える
20

私はvi、lsなどのエイリアスをよく持っていますが、エイリアスをエスケープしたい場合があります。前のコマンドにバックスラッシュを追加するだけです。

例えば:

$ alias vi=vim
$ # To escape the alias for vi:
$ \vi # This doesn't open VIM

かっこいいですね。

于 2008-09-16T11:12:02.480 に答える
17

私は以下をよく使います:

:p履歴結果を出力する修飾子。例えば

!!:p

最後のコマンドを出力するので、再度実行する前にコマンドが正しいことを確認できます。入力!!するだけで実行できます。

同じような調子で:

!?foo?:p

文字列「foo」を含む最新のコマンドの履歴を検索して出力します。

印刷する必要がない場合は、

!?foo

検索を実行し、すぐに実行します。

于 2008-09-16T04:47:06.400 に答える
17

ここでは、構成の微調整をいくつか示します。

~/.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
于 2008-09-16T01:11:15.887 に答える
16

私は秘密兵器を持っています: shell-fu.

ほとんどの場合、1行に収まる賢いヒント、クールなトリック、効率的なレシピが何千もあります.

私が大好きなもの (ただし、現在ほとんどの Unix システムに Python がインストールされているという事実を利用しているため、少しごまかしています):

alias webshare='python -m SimpleHTTPServer'

これで、「webshare」と入力するたびに、現在のディレクトリがポート 8000 経由で利用できるようになります。USB キーやリモート ディレクトリを使用せずに、ローカル ネットワーク上で友人とファイルを共有したい場合に非常に便利です。ビデオと音楽のストリーミングも機能します。

そしてもちろん、完全に役に立たないが、それでもとても楽しい古典的なフォーク爆弾 :

$ :(){ :|:& };:

本番サーバーでそれを試さないでください...

于 2008-09-21T14:22:52.423 に答える
12

watchコマンドを別のコマンドと組み合わせて使用​​して、変更を探すことができます。この一例は、ルーターをテストしていて、信号対雑音比などの最新の数値を取得したかったときです。

watch --interval=10 lynx -dump http://dslrouter/stats.html
于 2008-09-16T00:59:17.430 に答える
11
type -a PROG

PROG が利用可能なすべての場所を見つけるために、通常は予想される /usr/bin/PROG ではなく ~/bin のどこかにあります。

于 2008-09-16T06:07:16.940 に答える
11

私はechoでコマンドを作成し、それらをシェルにパイプするのが好きです:

$ find dir -name \*~ | xargs echo rm
...
$ find dir -name \*~ | xargs echo rm | ksh -s

なんで?実行する前に何が実行されるかを確認できるからです。そうすれば、恐ろしいエラー (ホーム ディレクトリの削除など) が発生した場合でも、発生する前にキャッチできます。明らかに、これは破壊的または取り返しのつかないアクションにとって最も重要です。

于 2008-09-16T01:10:05.220 に答える
10

pushdほとんどの場合、popd便利です

于 2008-09-16T02:07:14.130 に答える
10

ツリー階層内の大きく離れた場所で複数のディレクトリを使用している場合にナビゲートする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
于 2008-09-16T03:07:58.977 に答える
10

大きなファイルをダウンロードするとき、私はよくします:

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ます。

于 2008-09-16T01:05:12.860 に答える
10

恐ろしいエンターを打つ前に複雑なラインを展開

  • Alt+ Ctrl+ eshell-expand-lineEsc (キーボードで , Ctrl+を使用する必要がある場合がありeます)
  • Ctrl+ _元に戻す
  • 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。

于 2011-01-06T13:50:41.943 に答える
9

私はいつも以下に偏っています:

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

于 2008-09-16T03:38:50.587 に答える
8

pbcopy

これにより、Mac システムのクリップボードにコピーされます。コマンドをパイプすることができます...試してください:

pwd | pbcopy

于 2009-10-05T15:32:02.933 に答える
7

コマンドラインから「set-ovi」を使用するか、.bashrcを使用すると、コマンドラインでvi編集モードになります。「挿入」モードで開始するため、通常どおり入力してバックスペースキーを使用できますが、「大きな」間違いを犯した場合は、escキーを押してから、viの場合と同じように「b」と「f」を使用して移動できます。単語を変更するにはcw。変更したい履歴コマンドを表示した後に特に役立ちます。

于 2008-09-16T02:52:18.470 に答える
7

String multiple commands together using the && command:

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

or

kill -9 1111 && ./start.sh
于 2008-09-16T03:02:12.080 に答える
7

重複ファイルファインダー

これにより、現在のディレクトリからチェックサムが再帰的に実行され、すべての同一のチェックサム結果のファイル名が返されます。

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]*\ *//;'

もちろん、パスを変更することもできます。
多分それを関数またはエイリアスに入れて、パラメータとしてターゲットパスを渡します。

于 2010-08-08T23:15:02.153 に答える
7
$ 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
于 2008-09-16T01:28:31.073 に答える
7

上記の多くと同様に、私の現在のお気に入りはキーストローク [alt] です。(Alt キーと "." キーを一緒に) これは $! と同じです。(前のコマンドの最後の引数を挿入します)ただし、それは即時であり、私にとっては入力が簡単です。(スクリプトでは使用できません)

例えば:

mkdir -p /tmp/test/blah/oops/something
cd [alt].
于 2008-09-16T08:58:49.977 に答える
6

!<コマンドの最初の数文字> は、一致する最後のコマンドを実行します。

例:

!b「なんでもビルド -O -p -t -i -on」 !.が実行されます./a.out

コンパイル、ビルド、実行などの長くて反復的なコマンドで最もうまく機能します。コーディングとテストの時間を大幅に節約できました。

于 2008-09-16T19:37:40.347 に答える
5

すばやくアクセスしたいディレクトリがたくさんあります。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/2cd 1

于 2010-09-16T06:46:39.107 に答える
4

重要なファイルを除く すべてを削除します:

# shopt -s extglob
# rm -rf !(important-file)

zshでも同じです:

# rm -rf *~important-file

重要なフィールドを別の辞書に移動し、すべてを削除して、重要なフィールドを元に戻す必要があることを知っていました。

于 2008-09-26T14:15:20.690 に答える
4

Ctrl+Lは通常、画面をクリアします。Bashプロンプト(明らかに)とGDB、および他の多くのプロンプトから機能します。

于 2008-09-16T02:58:02.603 に答える
4

以下を 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
于 2008-09-16T11:19:54.957 に答える
4

履歴置換文字を使用して、、 など!#と組み合わせて現在のコマンド ラインにアクセスします。^$

たとえば、"old-" プレフィックスを付けて邪魔にならない場所にファイルを移動します。

mv file-with-long-name-typed-with-tab-completion.txt old-!#^

于 2008-09-30T15:57:30.987 に答える
3

さて、これは少し話題から外れているかもしれませんが、あなたがEmacsユーザーなら、「emacs」が最も強力なトリックだと思います...これに反対する前に、emacsインスタンス内で「Mxshell」を試してください... emacs内にシェルを取得し、シェルのパワーとともにemacsのすべてのパワーを持ちます(その中に別のemacsを開くなど、いくつかの制限がありますが、ほとんどの場合、バニラバッシュプロンプトよりもはるかに強力です)。

于 2008-09-16T00:59:12.953 に答える
3

プロンプトの色のスプラッシュが好きです:

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

あなたが見たいものに従ってカスタマイズ:)

于 2008-09-16T01:04:32.567 に答える
3

間違った行を入力したことに気付いたときに行う簡単な方法は、Ctrl+C を押すことです。行を保持したいが、最初に何か他のことを実行する必要がある場合は、新しい行をバック スラッシュ (\) で開始し、次に Ctrl+C を押します。行は履歴に残ります。

于 2008-09-16T09:15:10.013 に答える
3

後方検索のための 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

于 2008-09-16T01:18:40.487 に答える
3

前の行を挿入 最終パラメータ

ALT-. これまでで最も便利なキーの組み合わせです。試してみてください。何らかの理由で誰もこれについて知りません。

何度も押して、古い最後のパラメータを選択します。

ほんの少し前に使用したものに別のことをしたい場合に最適です。

于 2009-09-21T08:21:32.110 に答える
3

中かっこ展開:

./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}...
于 2010-05-22T23:44:02.560 に答える
2

エイリアスにさまざまな誤植があります

alias mkae=make

alias mroe=less
于 2008-09-16T02:57:04.340 に答える
2

エイリアスを使用すると時間を節約できます

alias myDir = "cd /this/is/a/long/directory; pwd"
于 2009-01-06T20:26:11.620 に答える
2

それほど曖昧ではありませんが、私が絶対に気に入っている機能の1つは、タブ補完です。
サブツリー構造全体をナビゲートしている場合、またはあいまいなコマンドや長いコマンドを使用している場合に非常に便利です。

于 2008-09-16T06:17:32.547 に答える
2

The easiest keystrokes for me for "last argument of the last command" is !$

echo what the heck?

what the heck?

echo !$

heck?
于 2008-09-16T03:01:58.837 に答える
2

$_(ドルの下線): 前のコマンドの最後の単語。!$のように履歴に置換を入れないことを除いて、同様!$です。

于 2008-09-16T04:51:31.567 に答える
2

SSH トンネル:

ssh -fNR 1234:localhost:22 root@123.123.123.123
于 2010-08-21T23:45:38.910 に答える
2

私のお気に入りではありません。コピーと貼り付けを使用して他の回答を試している場合は非常に役立ちます。

function $
{
    "$@"
}

$これで、各行の先頭にプロンプ​​トを含む例を貼り付けることができます。

于 2011-03-02T05:26:44.693 に答える
2

ファイルから重複行を削除する

#sort -u filename > filename.new

条件に一致しないすべての行を一覧表示する

#grep -v ajsk filename

これらは必ずしもBash固有のものではありません(しかし、どちらもそうではありませんls -thor:))

その他の便利なコマンド:

prtdiag、psrinfo、prtconf - 詳細はこちらこちら(私のブログへの投稿)。

于 2008-09-16T05:16:25.847 に答える
2

alias ..='cd ..'

したがって、ディレクトリをナビゲートするときは、単に使用します..<Enter>

于 2009-10-17T06:01:58.230 に答える
2

CTRL+Dはシェルを終了します。

于 2008-09-16T11:37:03.980 に答える
2

私は Bashジョブ コントロールの大ファンです。特に端末で開発を行っている場合は、主に と を使用しControl-Zます。fgemacs を開いていて、コンパイルやデプロイなどをControl-Z行う必要がある場合は、emacs を一時停止し、必要なことを行い、fg元に戻すだけです。これにより、すべての emacs バッファーがそのまま保持され、何を行っていても再起動するよりもはるかに簡単になります。

于 2009-04-15T16:58:44.977 に答える
1

これにより、ファイルの最後で画面がクリアされるのを防ぐことができます

export LESS="-X"
于 2008-09-16T02:53:48.620 に答える
1

私はMacでのプログラミングに不慣れで、bashからGUIプログラムを起動できないので、次のような関数を作成する必要があります。

function macvim
{
/Applications/MacVim.app/Contents/MacOS/Vim "$@" -gp &
}
于 2008-09-19T16:13:05.840 に答える
1

<何でも>| 並べ替え| uniq -c | 並べ替え-n

<anything>のすべての異なる発生のカウントを提供します。

多くの場合、awk、sed、またはcutは、<anything>のデータの解析に役立ちます。

于 2008-09-16T04:28:57.817 に答える
1

いくつかのBashナゲットもここにあります:

http://codesnippets.joyent.com/tag/bash

于 2008-09-24T15:02:30.027 に答える
1

du -a | 並べ替え-n| テール-99

大きなファイル(またはファイルのディレクトリ)を見つけてクリーンアップし、ディスク領域を解放します。

于 2008-09-16T04:30:44.253 に答える
1

bashは、TCP/IPソケットとの間でリダイレクトできます。/ dev /tcp/および/dev/udp。

これはセキュリティの問題だと考える人もいますが、それがSolarisXの刑務所のようなOSレベルのセキュリティの目的です。

Will Robertsonが指摘しているように、プロンプトを変更して処理を実行します...コマンド#for!nnを出力します。Xtermターミナル名を設定します。トラフィックをスニッフィングしてタイトルを設定しない古いXtermの場合。

于 2008-09-16T01:02:16.987 に答える
1

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.
于 2008-09-16T03:16:28.473 に答える
1
sudo !!

管理者権限で最後のコマンドを実行します。

于 2008-10-05T13:05:30.863 に答える
1

インタラクティブなシェル トリックではありませんが、優れたスクリプトを作成するためのトリックとして有効です。

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]ます。

于 2010-05-27T14:51:52.247 に答える
1

ctrl-u 書かれたものをすべて削除

于 2010-05-24T04:48:16.057 に答える
1

そして、これは実際に私にとって重要です:

set -o vi

/アラン

于 2008-09-16T01:29:54.063 に答える
1

拡張グロビング:

rm !(foo|bar)

or*なしのように展開します:foobar

$ ls
foo
bar
foobar
FOO
$ echo !(foo|bar)
foobar FOO
于 2010-11-16T22:04:05.570 に答える
1

私はいつもこれが好きでした。これを /etc/inputrc または ~/.inputrc に追加します

"\e[A":history-search-backward "\e[B":history-search-forward

入力ls <up-arrow>すると、「ls」で始まる最後のコマンドまたは入力したその他のコマンドに置き換えられます。

于 2008-09-16T01:35:51.197 に答える
1

私のお気に入りの 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 パイプ" を実行することもできます !!

于 2008-09-26T13:59:53.580 に答える
1

Shell-fuは、コマンド ラインのヒントやコツを保存、モデレート、および伝達するための場所です。StackOverflow に少し似ていますが、シェル専用です。この質問に対する答えはたくさんあります。

于 2009-04-15T16:43:17.247 に答える
1

ログ ファイルの最後の数行を取得したいですか。

tail /var/log/syslog

ログ ファイルがいつ変更されるかを監視したいですか。

tail -f /var/log/syslog

ファイルを最初からすばやく読みたいですか?

more /var/log/syslog

ファイルにテキストが含まれているかどうかをすばやく確認したいですか?

grep "find this text" /var/log/syslog
于 2008-09-16T11:35:00.007 に答える
1
while IFS= read -r line; do
echo "$line"
done < somefile.txt

これは、ファイルを 1 行ずつ処理するのに適した方法です。行の先頭または末尾にある空白文字を取得するには、IFS をクリアする必要があります。バックスラッシュを含むすべての生の文字を取得するには、「-r」が必要です。

于 2008-09-21T01:58:22.727 に答える
1

再び上位 10 コマンド ( ctcherryの投稿のように、短いだけ):

history | awk '{ print $2 }' | sort | uniq -c |sort -rn | head
于 2008-09-18T18:51:09.240 に答える
1

まったくのユーモア要素として、空のファイル「myself」を作成してから、次のようにします。$ touch myself

于 2010-08-23T15:24:38.800 に答える
1

数年前、p*コマンドを発見したり、プロセスに関する情報を取得したりしました: ptreepgreppkill、およびpfiles。もちろん、それらすべての母体はpsですが、高負荷下での出力を理解するには 、出力をlessgrep、および/またはawkにパイプする必要があります。トップ(およびバリアント)も役立ちます。

于 2008-09-16T06:38:17.350 に答える
1

私は本当にばかげていますが、深いツリー構造をナビゲートするときに非常に役立つものを持っています。これを .bashrc (または同様のもの) に入れます。

alias cd6="cd ../../../../../.."
alias cd5="cd ../../../../.."
alias cd4="cd ../../../.."
alias cd3="cd ../../.."
alias cd2="cd ../.."
于 2008-09-30T10:57:22.097 に答える
1

シンボリックリンクを含むディレクトリの正確な再帰コピー/バックアップを作成するのに適しています(シンボリックリンクをたどったり、cpのように無視したりするのではなく):

$ mkdir new_dir
$ cd old_dir
$ tar cf - . | ( cd ../old_dir; tar xf - )
于 2008-09-18T00:03:11.137 に答える
1

他の誰かが Emacs で "Mx shell RET" を勧めました。「Mx eshell RET」はもっといいと思います。

于 2010-11-23T12:49:41.237 に答える
1

Mac OS X では、

ESC .

最近の引数を順番に循環します。つまりESC、 を押して放し、次に.(ピリオド キー) を押して放します。Ubuntuでは、ALT+..

これを複数回実行して、最近のすべての議論に戻ることができます。CTRL+に似Rていますが、引数のみです。また、実際にコマンドを実行する前に何が得られるかがわかるため、 !!orよりもはるかに安全です。$!

于 2008-10-02T22:13:09.430 に答える
1

クイックテキスト

私はこれらの一連のテキストを頻繁に使用するので、それらへのショートカットを次のように配置します.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
于 2010-05-27T14:45:17.533 に答える
1

プログラム可能な完了:

派手なものはありません。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
于 2010-05-27T14:46:01.510 に答える
1

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
于 2008-09-16T19:02:39.540 に答える
1

GNU/Linux の pbcopy および pbpaste エイリアス

alias pbcopy='xclip -selection clipboard'
alias pbpaste='xclip -selection clipboard -o'
于 2010-11-17T03:09:47.677 に答える
1

私は常に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」で始まるすべての定義済み変数のリストを出力します。

于 2009-07-16T16:54:28.180 に答える
1

シグナルトラップ:

シェル プロセスに送信されたシグナルをトラップし、コマンド ラインで入力したかのように、それぞれの環境でサイレントにコマンドを実行させることができます。

# 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
于 2010-05-27T14:59:58.627 に答える
0

私はviでmanページを読むのが好きなので、.profileまたは.bashrcファイルに次のようにあります。

man () {
    sought=$*
    /usr/bin/man $sought | col -b | vim -R -c "set nonumber" -c "set syntax=man"  -
}
于 2008-09-16T02:55:04.843 に答える
0

Macのみ。これは簡単ですが、MANは私がこの数年前に知っていたらよかったのにと思います。

open ./

Finderで現在のディレクトリを開きます。また、デフォルトのアプリケーションで任意のファイルを開くために使用することもできます。URLにも使用できますが、URLの前に。を付ける場合に限りますhttp://。これにより、不定期のランダムサイトを開くためのユーティリティが制限されます。

于 2010-03-18T11:17:38.493 に答える
0

私は常にデフォルトのプロンプトを「username@hostname:/ current / path / name / in/full>」に設定します

PS1='\u@\h:\w> '
export PS1

さまざまなマシンを扱うときに、多くの混乱を回避できます。

于 2008-09-19T19:11:04.977 に答える
0

いくつかのオーディオおよびビデオ編集ツールを探しているときに私が見つけたいくつかの便利な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 
于 2008-09-16T01:05:18.053 に答える
0

バッチ モード (-b) を使用してトップ コマンド出力をファイルにリダイレクトする方法について言及したいと思います。

$ top -b -n 1 > top.out.$(日付 +%s)

デフォルトでは、top はインタラクティブ モードを使用して呼び出されます。このモードでは、top は無期限に実行され、キー入力を受け入れて top の動作を再定義します。

私が書いた記事はここにあります

于 2008-12-22T01:12:40.050 に答える
0
alias -- ddt='ls -trFld'
dt () { ddt --color "$@" | tail -n 30; }

現在のディレクトリ内の最新のファイルを提供します。私はいつもそれを使用しています...

于 2008-09-16T07:51:45.800 に答える
0

カスタム タブ補完 (compgen および完全な bash ビルトイン)

タブ補完は素晴らしいですが、それをファイル名以外にも適用できるのは素晴らしいことです。これを使用してカスタム関数を作成し、引数を常に使用するコマンドに展開しました。たとえば、FQDN を引数としてコマンドに追加する必要がよくあるとします (例: ping blah.really.long.domain.name.foo.com)。compgen と complete を使用して、/etc/hosts ファイルを読み取って結果を取得する bash 関数を作成できます。入力する必要があるのは次のとおりです。

ping blah.<tab>

現在のすべてのマッチ オプションが表示されます。

したがって、基本的に単語リストを返すことができるものはすべて関数として使用できます。

于 2008-09-18T15:28:41.660 に答える
0

ディレクトリ内で何かを検索しているが、ファイルがわからない場合は、次の方法でディレクトリ内のファイルを grep します。

find . -exec grep whatIWantToFind {} \;
于 2008-09-16T07:05:37.597 に答える
0
alias mycommand = 'verylongcommand -with -a -lot -of -parameters'
alias grep='grep --color'

grep で複数の単語を検索:

netstat -c |grep 'msn\|skype\|icq'
于 2008-09-16T06:12:07.710 に答える
0
# Batch extension renamer (usage: renamer txt mkd)
renamer() {
   local fn
   for fn in *."$1"; do
     mv "$fn" "${fn%.*}"."$2"
   done
}
于 2010-11-16T21:50:22.313 に答える
0

$PATH にあることがわかっているシェルスクリプトをすばやく編集できるようにするには (ls を使用しないでください...):

function viscr { vi $(which $*); }
于 2008-09-16T17:48:28.987 に答える
0

簡単な計算機として、パーセンテージを計算するとします。

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

除算が切り捨てられたり、丸められたりするわけではありません。しかし、多くの場合、簡単な計算には十分です。

于 2008-09-18T17:33:56.647 に答える
0

私のお気に入りの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
于 2008-11-30T05:41:34.420 に答える
0

新しいディレクトリに変更し、ファイルを新しいディレクトリから古いディレクトリに移動したいと考えています。一手で:mv file $OLDPWD

于 2008-09-16T06:42:17.747 に答える
0

Apropos history -- 不可解なキャレットなどを使用することは、完全に直感的ではありません。特定の文字列を含むすべての履歴項目を印刷するには:

function histgrep { fc -l -$((HISTSIZE-1)) | egrep "$@" ;}
于 2008-09-16T18:02:35.177 に答える
0

検索を使用して、テキストに一致するファイルを見つける方法 | grep -H この例では、どの ruby​​ ファイルにジャンプ文字列が含まれているか -

探す 。-name '*.rb' -exec grep -H jump {} \;

于 2009-12-02T15:30:43.560 に答える
0

大量の出力 (大きな「make」など) を伴うコマンドを実行する場合、出力を保存するだけでなく、表示することも必要です。

make install 2>&1 | ティーイーメイク

于 2008-09-18T16:45:08.980 に答える
0

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 行のコマンドを超えたときにコマンド ラインを正しく再描画できるようにするためです。

于 2008-12-06T23:51:45.090 に答える
0

./mylittlealgorithm < 入力.txt > 出力.txt

于 2010-05-27T14:58:43.073 に答える
0
find -iregex '.*\.py$\|.*\.xml$' | xargs egrep -niH 'a.search.pattern'  | vi -R -

すべての Python ファイルとすべての XML ファイルでパターンを検索し、結果を読み取り専用のVimセッションにパイプします。

于 2008-10-06T09:30:26.567 に答える