なぜ、誰のために記事がありますか?
当初は、Unixのようなシステムで作業を開始する学生向けのメモでした。 言い換えれば、この記事は、unixコマンドラインでの以前の経験はないが、何らかの理由でそれと効果的に対話する方法を望んでいるか、学ぶべきである人を対象としています。
マナ(文書)の改定は行われず、記事は読みをキャンセルしたり置き換えたりしません。 代わりに、作業が効果的で快適になるように、UNIXシェルで作業の最初から理解する必要がある主な事項(コマンド、トリック、および原則)について説明します。
この記事は、フル機能のシェル(zshまたはbashが望ましい)とかなり幅広い標準プログラムを備えた、本格的なunixライクな環境に関するものです。
シェルとは何ですか?
シェル(シェル、別名「コマンドライン」、別名CLI、別名「コンソール」、別名「端末」、別名「黒い文字で黒いウィンドウ」)は、オペレーティングシステムと通信するためのテキストベースのインターフェイスです(まあ、厳密にGovra、これはそのようなインターフェースを提供するプログラムですが、現在この違いは重要ではありません)。
一般的に、シェルを介した作業は次のようになります:ユーザー(つまり、あなた)はキーボードからコマンドを入力し、Enterを押すと、システムはコマンドを実行し、実行結果を画面に書き込み、次のコマンドが入力されるのを再び待ちます。
典型的なシェル:

シェルは、すべてのUnixライクなサーバーシステムと対話するための主要な方法です。
コマンドラインシステムはどこにありますか?
UNIXシェル、一般的なオプションはどこで期待できますか:
- MacOS(bash);
- 職場または個人のWebプロジェクトのサーバーへのリモートアクセス。
- リモートアクセスを備えたホームファイルサーバー。
- Ubuntu、ラップトップ/デスクトップ上のPC-BSD-UNIXに似たシステムは、簡単にインストールして使用できます。
シェルで解決するのに妥当なタスクは何ですか?
シェルが適切で有用で不可欠な自然なタスク:
- ターミナルでのインタラクティブな作業:
- コンパイル、makeによるタスクの実行。
- テキストファイルの比較。
- 高速アドホックデータ分析(ログ内の一意のIPの数、時間/分によるレコードの分布など)。
- 1回限りの一括アクション(多くのプロセスに勝つため、バージョン管理システムを使用している場合-ファイルの反転または追加);
- システムで起こっていることの診断(セマフォ、ロック、プロセス、記述子、ディスク容量など);
- スクリプティング:
- 他のインタープリターの存在に頼ることができない実行用のインストールスクリプト-これは初心者向けではありません。
- インタラクティブシェルをカスタマイズする機能(招待に影響を与える、ディレクトリを変更する、環境変数を設定する)も初心者向けではありません。
- バルクファイルトランスコーディングなどの1回限りのスクリプト。
- メイクファイル。
絶対に最初のステップ
はじめに:入場と退場
シェルを起動する方法とシェルから抜け出す方法を正確に知ってください。
Ubuntuがインストールされているマシンで作業している場合は、ターミナルプログラムを実行する必要があります。 作業が終了したら、単にウィンドウを閉じることができます。
MacOSでは、ターミナルも実行します。
リモートサーバーにアクセスするには、
ssh
(MacOS、Ubuntu、または他のUnix系システムが
putty
場合)または
putty
(Windowsがある場合)を使用します。
私は誰、私はどこですか?
次のコマンドを実行します。
-
hostname
-現在いるマシン(サーバー)の名前を表示します。 -
whoami
ログイン(システム内の名前)を表示します。 -
tree -d / |less
less-マシン上のディレクトリツリーの擬似画像。 スクロールを終了q
; -
pwd
現在いるディレクトリを表示します。 コマンドラインでは、「ちょうどそのように」なることはできません。あるディレクトリ(=現在のディレクトリ、作業ディレクトリ)にいるはずです。 ほとんどの場合、現在の作業ディレクトリがプロンプトに表示されます。 -
ls
現在のディレクトリ内のファイルのリスト。ls /home
指定されたディレクトリ内のファイルのリスト。
チームの歴史(歴史)
完全なコマンドラインの重要な機能は、コマンドの履歴です。
いくつかのコマンドを実行します:
hostname
、
ls
、
pwd
、
whoami
。 次に、上キーを押します。 前のコマンドが入力行に表示されました。 上下キーを使用して、ストーリーを前後に移動します。
hostname
にスクロールしたら、Enterを押します-コマンドが再度実行されます。
履歴からのコマンドは繰り返すだけでなく、編集することもできます。 履歴を
ls
までスクロールし、それに
-l
スイッチを追加します(
ls -l
であることが判明しました。マイナス記号の前にスペースがありますが、後にはありません)。 Enterを押します-変更されたコマンドが実行されます。
履歴のスクロール、コマンドの編集および再実行は、コマンドラインで作業する際の最も一般的なアクションであり、それに慣れる。
コピーペースト
コマンドラインは非常にテキスト中心です。コマンドはテキストであり、ほとんどの標準プログラムへの入力はテキストであり、作業の結果はほとんどの場合テキストでもあります。
このテキストの優れた機能は、コピーして貼り付けることができることです。これは、コマンドラインにも当てはまります。
コマンド
date +"%y-%m-%d, %A"
試してください
完全に手で入力したのですか、それとも記事からコピーしたのですか? コピーしてターミナルに貼り付け、実行できることを確認してください。
man
使用方法を学習した後、ヘルプからサンプルコマンドをコピーして実行できることを確認してください。 確認するには、
date
プログラムのヘルプで「使用
EXAMPLES
セクションを探し、最初の例をコピーして実行します(念のため:ドル記号がコマンドの一部ではない場合、これは入力する招待状の条件付き画像です)。
端末からテキストを正確にコピーして端末に貼り付ける方法は、システムとその設定によって異なります。したがって、残念ながら、普遍的な指示を出すことはできません。 Ubuntuでは、これを試してください。コピーは単なるマウス選択であり、貼り付けは中央のマウスボタンです。 機能しない場合、または別のシステムを使用している場合は、インターネットを検索するか、経験豊富な友人に尋ねてください。
キーとオプション
コマンドの履歴を調査するとき、lsコマンドには少なくとも2つのオプションがあるという事実に既に遭遇しています。 このように呼び出すと、簡単なリストが表示されます。
[22:26]akira@latitude-e7240: ~/shell-survival-quide> ls Makefile shell-first-steps.md shell-first-steps.pdf shell-survival-quide.md shell-survival-quide.pdf
-l
スイッチを追加すると、各ファイルの詳細情報が表示されます。
[22:28]akira@latitude-e7240: ~/shell-survival-quide> ls -l total 332 -rw-rw-r-- 1 akira akira 198 Feb 13 11:48 Makefile -rw-rw-r-- 1 akira akira 15107 Feb 14 22:26 shell-first-steps.md -rw-rw-r-- 1 akira akira 146226 Feb 13 11:49 shell-first-steps.pdf -rw-rw-r-- 1 akira akira 16626 Feb 13 11:45 shell-survival-quide.md -rw-rw-r-- 1 akira akira 146203 Feb 13 11:35 shell-survival-quide.pdf
これは非常に一般的な状況です。コマンド呼び出しに特別な修飾子(キー、オプション、パラメーター)を追加すると、コマンドの動作が変わります。 比較:
tree /
と
tree -d /
、
hostname
と
hostname -f
さらに、コマンドはパラメーターとしてファイル名、ディレクトリ、または単なるテキスト文字列を使用できます。 試してください:
ls -ld /home ls -l /home grep root /etc/passwd
男
man
マシンで使用可能なコマンドとプログラム、およびシステムコールとC標準ライブラリのヘルプ。
試してください:
man grep
、
man atoi
、
man chdir
、
man man
。
「上」、「下」、「PageUp」、「PageDown」のボタンを使用して前後にスクロールし、
q
ボタンを使用してヘルプの表示を終了します。 ヘルプ記事で特定のテキストを検索します。/(スラッシュ)を押し、検索するテキストを入力して、Enterを押します。 次の出現箇所に移動
n
キー。
すべての参照記事はカテゴリに分類されます。 最も重要なこと:
- 1-実行可能プログラムおよびシェルコマンド(
wc
、ls
、pwd
など); - 2-システムコール(
fork
、dup2
など) - 3-ライブラリ関数(
printf
、scanf
、cos
、exec
)。
名前が一致する場合に、どのカテゴリからヘルプを表示する必要があるかを示します。 たとえば、
man 3 printf
はC標準ライブラリの関数を記述し、
man 1 printf
man 3 printf
は同じ名前のコンソールプログラムを記述します。
man -k .
コマンドを使用して、マシンで利用可能なすべてのヘルプ記事のリストを表示できます
man -k .
(ドットもチームの一部です)。
少ない
非常に長いテキスト(ファイルの内容、長い人など)を小さなターミナルウィンドウで表示する必要がある場合、特別なページャープログラム(単語ページ/ページ、つまりページリーフレットから)が使用されます。 最も人気のあるリーフレットは
less
であり、mansを読むときにスクロールを提供するのはそれです。
動作を試して比較してください:
cat /etc/bash.bashrc cat /etc/bash.bashrc |less
パラメータですぐにファイルをスクローラーに転送できます。
less /etc/bash.bashrc
上下にスクロール-「上」、「下」、「PageUp」、「PageDown」、終了-ボタン
q
特定のテキストの検索:
/
(スラッシュ)を押し、検索するテキストを入力して、Enterを押します。 次の出現箇所に移動
n
キー。 (
man
に関するマニュアルを知っていますか?ヘルプを表示するために
less
も使用されるのも不思議ではありません。)
権利
「権利」のセットは、任意のファイルまたはディレクトリに関連付けられます。ファイルを読み取る権利、ファイルに書き込む権利、ファイルを実行する権利。 すべてのユーザーは、ファイル所有者、ファイル所有者グループ、その他すべてのユーザーの3つのカテゴリに分類されます。
ls -l
を使用してファイル許可を表示できます。 例:
> ls -l Makefile -rw-r--r-- 1 akira students 198 Feb 13 11:48 Makefile
この結論は、所有者(akira)がファイルの読み取りと書き込みを行い、グループ(生徒)が読み取りのみを行い、残りのユーザーも読み取りを行えることを意味します。
職場で
permission denied
というメッセージを受け取った場合、それはあなたが働きたいと思う正しいオブジェクトを持っていないことを意味します。
詳しくは
man chmod
をご覧ください。
STDIN、STDOUT、コンベア(パイプ)
各標準プログラムは、
STDIN
入力データストリーム、
STDOUT
出力データストリーム、
STDERR
エラー出力ストリームの3つの標準データストリームに関連付けられています。
wc
プログラムを実行し、テキスト
Good day today
を入力してEnterを押し、テキスト
good day
を入力してEnterを押し、Ctrl + dを押します。
wc
プログラムは、テキストおよび末尾の文字、単語、行の数に関する統計を表示します。
> wc good day today good day 2 5 24
この場合、2行のテキストを
STDIN
プログラムに送信し、
STDOUT
3つの数値を受け取りました。
コマンド
head -n3 /etc/passwd
実行すると、次のようになります。
> head -n3 /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin
この場合、
head
プログラムは
STDIN
から何も読み取らず、
STDOUT
3行書き込みました。
このように想像
STDOUT
ます。プログラムは、
STDIN
流入するパイプであり、
STDOUT
続きます。
Unixコマンドラインの最も重要な特性は、パイププログラムを相互接続できることです。あるプログラムの出力(
STDOUT
)を入力(
STDIN
)として別のプログラムに転送できます。
接続されたプログラムのこの設計は、英語のパイプ(パイプ)、ロシア語-コンベアまたはパイプで呼び出されます。
プログラムをパイプラインに結合する方法は次のとおりです
|
(縦棒)
コマンド
head -n3 /etc/passwd |wc
を実行すると、次のような
head -n3 /etc/passwd |wc
ます。
> head -n3 /etc/passwd |wc 3 3 117
head
プログラム
STDOUT
3行のテキストを
STDOUT
に
STDOUT
、すぐに
wc
プログラムの入力に移動し、結果のテキストの文字、単語、行の数を数えました。
必要な数のプログラムをパイプラインに結合できます。 たとえば、前のパイプラインに別の
wc
プログラムを追加すると、最初の
wc
出力に含まれていた単語と文字の数をカウントできます。
> head -n3 /etc/passwd |wc |wc 1 3 24
コマンドラインで作業する場合、パイプラインのコンパイルは非常に一般的なことです。 これが実際にどのように行われるかの例については、「単一ラインコンベヤのコンパイル」セクションをお読みください。
I / Oリダイレクト
プログラムの出力(
STDOUT
)は、パイプラインを介して別のプログラムに転送できるだけでなく、単にファイルに書き込むことができます。 このリダイレクトは、
>
(「詳細」記号)を使用して行われます。
date > /tmp/today.txt
このコマンドの結果、ファイル
/tmp/today.txt
がディスクに表示されます。
cat /tmp/today.txt
その内容を表示します
同じ名前のファイルが既に存在する場合、その古い内容は破棄されます。 ファイルが存在しなかった場合、作成されます。 コマンドが実行される前に、ファイルが作成されるディレクトリが存在する必要があります。
ファイルを上書きしたくないが、最後に出力を追加する場合は、
>>
使用し
>>
。
date >> /tmp/today.txt
ファイルに現在書き込まれている内容を確認してください。
さらに、プログラムは
STDIN
代わりに任意のファイルを転送でき
STDIN
。 試してください:
wc </etc/passwd
不明な場合の対処方法
理解できないシステム動作、または特定の結果を達成したいが方法がわからない場合は、次の順序で行動することをお勧めします(ちなみに、これはシェルだけでなく):
- 可能な限り明確に質問または課題を策定します-「それ、私は何を知らない」を解決することよりも複雑なことはありません。
- 同じまたは同様の問題に既に直面している場合は覚えておいてください-この場合、前回機能したソリューションを試す価値があります。
- 適切なマンを読んでください(あなたのケースに適したマンがわかっている場合)-コマンド、必要なオプション、または他のコマンドへのリンクを使用する適切な例を見つけることができます。
- 思う:タスクを少し変更することは可能ですか? -おそらく、条件を少し変更することで、解決方法をすでに知っているタスクを取得できます。
- 検索エンジンで明確に定式化された質問をします。おそらく答えはStack Overflowまたは他のサイトで見つけることができます。
上記のいずれも役に立たない場合は、教師、経験豊富な同僚、または友人のアドバイスを求めてください。 そして、「愚かな」質問をすることを恐れないでください-それは知らないのは恥ではありません、尋ねないのは恥です。
難しい問題(インターネットや他の人を使って自分で)を見つけた場合は、あなたや仲間が再び同じ問題を抱えている場合に備えて解決策を書き留めてください。 Evernoteで簡単なテキストファイルに書き込み、ソーシャルネットワークで公開できます。
作業方法
コピーアンドペースト -マン、StackOverflowの記事など。コマンドラインはテキストで構成され、これを使用します。コマンドの例をコピーして使用し、成功した検索結果をメモリに書き込み、Twitterおよびブログに公開します。
男を読んでください 。 ナフは言った。
履歴から前のコマンドを引き出し、別のコマンドをパイプラインに追加し、開始、繰り返します。 「単一ラインコンベアのコンパイル」セクションも参照してください。
基本チーム
- 別のディレクトリに移動します:
cd
; - ファイルの内容の表示:
t
、less
、head
、tail
; - ファイル操作:
cp
、mv
、rm
; - ディレクトリの内容の表示:
ls
、ls -l
、ls -lS
; - ディレクトリ構造:
tree
、tree -d
(パラメータとしてディレクトリを渡すことができます); - ファイル検索:
find . -name ...
find . -name ...
;
分析
-
wc
、wc -l
; -
sort -k
指定されたフィールドでソートします。 -
sort -n
数値参照。 -
diff
ファイル比較; -
grep
、grep -v
、grep -w
、grep '\<word\>'
、grep -E
テキストを検索します。 -
uniq
、uniq -c
ストリングの一意化。 -
awk
バリアントawk '{print $1}'
では、各行の最初のフィールドのみを残すために、$1
を$2
、$3
などに変更できます。
システム診断
-
ps axuww
マシンで実行されているプロセス(実行中のプログラム)に関する情報。 -
top
最もリソースを消費するプロセスのインタラクティブな表示。 -
df
占有および空きディスク容量。 -
du
ディレクトリ内のファイルの合計サイズ(再帰的にサブディレクトリを使用); -
strace
、ktrace
プロセスが実行するシステムの呼び出し。 -
lsof
プロセスが使用するファイル。 -
netstat -na
、netstat -nap
システムで開いているポートとソケット。
一部のプログラムがない場合、追加でインストールする必要があります。 さらに、これらのプログラムの一部のオプションは、特権ユーザー(
root
'y)のみが利用できます。
大量および半自動実行
最初にこのセクションをスキップしてください。単純なシェルスクリプトを作成するときに、これらのコマンドと構成が必要になります。
-
test
-条件の確認。 -
while read
-STDIN
行をループしSTDIN
。 -
xargs
-STDIN
から指定されたプログラムのパラメーターへの行の置換。 -
seq
自然数のシーケンスの生成。 -
()
-複数のコマンドの出力を組み合わせます。 -
;
-次々に実行します。 -
&&
-最初のチームが正常に完了したことを条件に実行します。 -
||
-最初のコマンドが正常に完了しなかった場合に実行します。 -
tee
プログラム出力をSTDOUT
およびディスク上のファイルに複製しSTDOUT
。
その他
-
date
-現在の日付。 -
curl
指定されたURLでドキュメントをダウンロードし、結果をSTDOUT
書き込みSTDOUT
。 -
touch
ファイル変更日を更新します。 -
kill
プロセスにシグナルを送信します。 -
true
何もせず、trueを返し、永遠のサイクルを整理するのに役立ちます。 -
sudo
-root
としてコマンドを実行します。
単一ラインコンベヤーの作成
実際のタスクの例を見てみましょう。現在のユーザーの代わりに実行されているすべての
task-6-server
プロセスを強制終了する必要があります。
ステップ1
純粋な形式でなくても、どのプログラムがほぼ必要なデータを生成するかを理解します。 このタスクでは、システム内のすべてのプロセスのリスト
ps axuww
取得する価値があります 。 実行する。
ステップ2
受信したデータを目で見て、不要なデータの一部を除外するフィルターを考え出します。 多くの場合、これは
grep
または
grep -v
です。 上ボタンを使用して、前のコマンドを履歴から引き出し、フィルターを割り当て、開始します。
ps axuww |grep `whoami`
-現在のユーザーのプロセスのみ。
ステップ3
必要なクリーンデータが得られるまで、手順2を繰り返します。
ps axuww |grep `whoami` | grep '\<task-6-server\>'
-目的の名前を持つすべてのプロセス(さらに、vim task-6-server.cなどのような余分なもの)、
ps axuww |grep `whoami` | grep '\<task-6-server\>' | grep -v vim ps axuww |grep `whoami` | grep '\<task-6-server\>' | grep -v vim |grep -v less
-目的の名前のプロセスのみ
ps axuww |grep `whoami` | grep '\<task-6-server\>' | grep -v vim |grep -v less |awk '{print $2}'
-必要なプロセスのpid-s、項目3は完了
ステップ4
適切な最終ハンドラーを適用します。 Upキーを使用して、履歴から前のコマンドを抽出し、問題の解決を完了する処理を追加します。
-
|wc -l
プロセス数をカウントする|wc -l
。 -
>pids
を>pids
してファイルに>pids
を書き込みます。 -
|xargs kill -9
killプロセス。
ワークアウト
新しいスキルを練習したいですか? 次のタスクを試してください。
- ホームディレクトリ内のすべてのファイルとディレクトリのリストを取得します。
- カテゴリ2(システムコール)からすべての
man
記事のリストを取得します。 -
grep
が発生する回数をカウントします。 - 現在
root
として実行されているプロセスの数をカウントします。 - ヘルプカテゴリの最大数(男性)に表示されるチームを見つけます。
- ya.ruページにvarという単語が何回現れるかを数えます。
ヒント:
find
、
grep -o
、
awk '{print $1}'
、
grep
正規表現、
curl -s
です。
さらに勉強するものは?
コマンドラインが気に入ったら、やめないで、スキルの向上を続けてください。
コマンドラインに住んでいる場合に間違いなく便利になるいくつかのプログラムは次のとおりです。
-
awk
-
sed
- 複雑なオプションで
find
-
apropos
-
locate
-
telnet
-
netcat
-
tcpdump
-
rsync
-
screen
-
ssh
-
tar
-
zgrep
、zless
-
visudo
-
crontab -e
-
sendmail
さらに、時間の経過とともに、
perl
や
python
など、何らかのスクリプト言語をマスターする価値があります。
誰がこれを必要としますか?
今日、コマンドラインとシェルスクリプトを勉強する価値はありますか? 間違いなく価値があります。 FBでの仕事に応募したい候補者のために、Facebookの要件からいくつかの例を挙げます。
データサイエンティスト、経済調査 :コマンドラインとUnixコアツールの使いやすさ。 望ましい:Pythonなどのスクリプト言語の熟達度、または以前のソフトウェアエンジニアリングの経験。
MySQLデータベースエンジニア :シェルスクリプト(Bash、Awkなど)の高度な習熟度。 Linux管理の高度な能力。
製造品質エンジニア、サーバー :Bash、Perl、またはPythonのスクリプト作成スキルが望ましい。
データプラットフォームエンジニア :Unix / Linuxシステムでの2年の経験。
DevOpsエンジニア、データ :Unix / Linuxシステム管理およびプログラミングの2年の経験。
ご質問は?
この記事について、または一般的にUnixコマンドラインでの作業について質問がある場合は、コメントまたは電子メール
liruoko (at) yandex (dot) ru
で質問してください。
便利で興味深いリンク
15の興味深いLinuxコマンド
Unix初心者向けのサバイバルガイド
興味深いBashプログラミング手法
オリジナル: 15分でより良いBashスクリプト
bashを使用したシェルプログラミング:例、反例
コンソールユーティリティをより便利にする簡単な方法
クローズドソースのようにプログラムをデバッグしてください!