1月6日 今日の学習記録
<目標>
<ファイルとディレクトリ>
ディレクトリ構造 (FHS)
- /
複数ディスクがあってもディレクトリはひとつ
- ディスクをマウントした場合ツリーのどこかに接続される
ls コマンドは複数ディレクトリを引数にあてられる
ls -F
ファイル種別を表示
<ファイルの基本操作>
mikdir
-p オプション
touch
- 本来は既存ファイルのタイムスタンプを更新するためのコマンド
- 既存ファイルがない場合はからのファイルが作成される
rm
-r オプション
cat
コマンドについて
- 表示するファイルを複数指定できる
-n
オブションで行番号を表示- ファイルを入力しないと、文字の入力を求められる
less
コマンドで指定ファイルの内容をページごとに表示
less /etc/bash.bashrc
space
:上へb
:下へq
:終了/ + 文字列
:ファイル内検索
cp
コマンド
mv
コマンド
- ディレクトリの移動に
-r
オプションはいらない
ln
コマンド
ハードリンク
ln "ファイル名1" "ファイル名2"
ファイル名1に別名をつける。元のファイル1が削除されてもファイル2を開けるとファイル1の内容が表示される。ファイル2が削除されて始めてファイル削除が完了する-s
オプションでシンボリックリンクを作成。その内容はリンク元ファイルへのパス。リンク元が削除されるとリンクが壊れたシンボリックリンクファイルが残る(aliasと同じ)。
<探す、調べる>
find
コマンドfind -name '*.text'
--name
ファイル名(大文字小文字区別あり) --iname
ファイル名(大文字小文字区別なし) --type -f
通常ファイル --type -d
ディレクトリ --type -l
シンボリックリンク メタ文字を使用する際はファイル名に'*.txt'
のようにクオテーションで囲まなければ、展開されたファイルの内容が検索の対象になってしまうので注意。
locate
コマンド
- 専用データベースから検索するため高速
- 事前にデータベースを
# updatedb
で更新が必要 -i
オプション(--ignore-case)で大文字小文字を無視できる-b
オプション(--basename)でファイル名のみを検索する。通常のlocate
はバス名まで検索してしまうので要注意。- 検索パターン(ワード)を複数並べてor検索
- or 検索に
-A
オプション(-all)で*:and検索**
--help
オプションとman
コマンド
コマンド名 --help
でコマンドの概要が表示されるman コマンド名
でコマンドの公式マニュアルが表示される。マニュアルはlessコマンで表示されるのでスペース
(下へ)、ctrl + b
(上へ)、q
(終了)で操作する。-k
インストールされたマニュアル内のキーワード検索、"copy"など機能を持ったコマンドを検索する
which
コマンド
- コマンド(パスの通った実行ファイル)のフルパスを表示
-a
オプションで重複する全ファイルを表示
言語設定
- 日本語のファイルはコマンドの前に"LANG=ja,UTF-8"を追加して表示
- 英語は'LANG=C'を追加
<テキストエディタ>
ファイルにはテキストファイルとバイナリファイルがある
- 人間が編集可能で互換性もあるテキストファイルは使いやすい
- 終わり以降の空白の行の行頭を
~
で示している。 :q
:終了:w
ファイルを上書き保存する:w<ファイル名>
名前を付けて保存する:q!
ファイルを保存せずにVimを終了する
h
左に移動するj
下に移動するk
上に移動するl
右に移動する
-
x
カーソル位置の文字を削除する -
i
カーソル位置の左に文字を追加する -
a
カーソル位置の右に文字を追加する
-
w
前方に単語1つぶん移動する -
b
後方に単語1つぶん移動する -
W
スペース区切りで前方に単語1つぶん移動する -
B
スペース区切りで後方に単語1つぶん移動する
0
行頭に移動する$
行末に移動するgg
1行目に移動するG
最後の行に移動する<数字>G
<数字>行目に移動するデリート=カット、
y
ヤンク=コピー、p
プット=ペーストヤンクはデリートの
d
をy
におきかえるだけ
d
$行末までをデリートd0
行頭までをデリートx、dl
1文字をデリートdw
単語1つをデリートdgg
最初の行までをデリートdG
最後の行までをデリートyy
現在カーソルのある行をヤンクdd
現在カーソルのある行をデリートj
下の行と連結u
undoctrl+r
redo/
<文字列>下方向に向かって<文字列>を検索する?
<文字列>上方向に向かって<文字列>を検索するn
次の検索結果に移動するN
前の検索結果に移動する%s/<置換元文字列>/<置換後文字列>/g
文字列を置換する:help
ヘルプ表示:help <コマンド>
コマンドの詳細表示
<bashの設定>
コマンドのエイリアス化 alias<名前>='<コマンド>'
alias la='ls -a' / alias ll='ls -l' / alias ls ='ls -F'
setコマンド
- オプションのオンとオフ。よく理解できなかった
shoptコマンド
- setと機能は同じだが、対象となるオプションが異なる。
シェル変数の設定
- <変数>=<値>
- var='text variable'
- 変数にスペースが入る場合は'で閉じる。=の両側にはスペースをいれない。
PS1=
>bash
- プロンプトを
>bash
に変更 \u \w \$
はユーザー名、ホームディレクトリ、\d
「曜日月日」という形式の日付\h
ホスト名のうち、最初の.までの部分\H
ホスト名\t
HH:MM:SS形式の現在時刻\u
ユーザ名\w
カレントディレクトリ\W
カレントディレクトリの末尾のディレクトリ名\$
rootユーザの場合は#、それ以外のユーザの場合は$\\
\そのもの
PATH="$PATH:̃~ /bin"
- 自作して/binに保存したファイルを直接実行できる
コマンドライン関連シェル変数
HISTFILE
コマンドライン履歴を保存するファイル名。デフォルト値は̃/.bash_historyHISTFILESIZE
履歴ファイルに保存するコマンドライン履歴の最大行数HISTSIZE
コマンドライン履歴を保持する最大行数
外部コマンドと組み込みコマンド
- シェル自体に内蔵しているコマンドを組み込みコマンドという
- ここで外部コマンドは、シェルのいわば「外側」で実行されます。そのため次の図のように、現在設定されているシェル変数の値を外部コマンドは参照することができません。
- 外部コマンドからも値を参照できるようにした変数を環境変数と言います。
printenv
環境変数の表示export (変数)
シェル変数を環境変数に設定export LESS='==no-init'
ログイン時の流れ
- bashをログインシェルとして起動したときは、まず/etc/profileが読み込まれ、続いて̃/.bash_profileが読み込まれます。bashはこれらのファイルに書かれた内容を実行します。bashの設定をカスタマイズするには、これら設定ファイルを、Vimなどのエディタを使って修正します。
- 、̃/.bash_profileと̃/.bashrcは、どちらもユーザ個別のbashの設定ファイルです。
̃/.bash_profileはログインしたときだけ読み込まれ、̃/.bashrcはbashを起動するたびに読み込まれるという違いがあります。そのため、ログイン時に一度だけ設定すればよい項目は̃/.bash_profileに書き、それ以外の、bashを起動するたびに毎回設定する必要がある項目は̃/.bashrcに書きます。しかし、実際には多くの設定はbashを起動するたびに毎回設定する必要があるため、基本的には̃/.bashrcに書いておけば問題ありません。
設定を行うシェルとは別にもう1つシェルを起動しておくことをお勧めします。
設定変更を行う前に別のターミナルエミュレータを起動しておきます。sshでログインして作業している場合は、設定変更用とは別にもう1つ別にsshでログインしておき、そちらはログアウトしないようにしておく、とすればよいでしょう。
`PS1='[\u@\h]\W\t\$'でプロンプトが変更される
<ファイルパーミッション、スーパーユーザ>
group <ユーザ名>
ユーザの所属するグループを表示
r
読み取り:ディレクトリに含まれるファイル一覧の取得w
書き込み:ディレクトリの下にあるファイル・ディレクトリの作成・削除x
実行:ディレクトリをカレントディレクトリにする(入る)- ファイルにのパーミッションにかかわらず、
w
が許可されていたら削除が可能 =
は指定した権限に変更
su -
は一般ユーザーの環境変数を受け継がないvisudoでsudoファイル /etc/sudoersに変更が加わる加わる
- ユーザ名ALL=(ALL)ALL
tmuxエミュレータ
- ターミナルマルチプレクサ 一つの端末の中に複数の仮想端末を開ける
<プロセスとジョブ>
プロセスとは これまで多くのコマンドを紹介してきましたが、これらのコマンドの実体はディスク上に保存されたファイルです。シェルからコマンドを実行すると、Linuxカーネルはディスクから実行ファイルを読み出してメモリに格納し、そのメモリ内容に従ってCPUがプログラムを実行します。ここで、メモリ上で実行状態にあるプログラムのことを「プロセス」と呼びます。
<ソース> 三宅 英明,大角 祐介. 新しいLinuxの教科書 (Japanese Edition) (p. 288).
- LINUXのプロセスにはプロセスIDが振られている
- プロセスには必ず親子関係がある。無からは生まれない。
- プロセス表示
ps
コマンドx
で別ターミナル、ターミナルに接続していないdaemonのプロセスを表示 f
でプロセスの親子関係を表示tty
はターミナルを示す。 -a
で全てのプロセスを表示- xpsコマンドを実行したユーザのプロセスすべてを表示uxpsコマンドを実行したユーザのプロセスすべてを、詳細情報を合わせて表示axすべてのユーザのプロセスを表示auxすべてのユーザのプロセスを、詳細情報を合わせて表示auxwwauxオプションで、コマンドラインが長くターミナルの右端で切れてしまう際に、表示幅を制限せずすべて表示
ジョブとは
- シェルから見た処理の単位をジョブと呼びます。シェルのコマンドラインに入力している1つの行が、1つのジョブにあたります。
ctrl +z
でジョブ停止jobs
で現在のジョブを表示-l
を追加してプロセスIDを表示するfg%<ジョブ番号>
で停止中のジョブをフォアグラウンドするbg%<ジョブ番号>
ジョブをバックグランドにして処理を続行する&
バックグラウンド処理を意味する。- コマンドに
&
をつけることで初めからバックグラウンドで実行される - ジョブの操作コマンドであるjobs、fg、bgはすべてシェルの組み込みコマンドです。
ジョブの終了
- フォアグランドは
ctrl +c
- バックグラウンドは
kill %(ジョブ番号)
- プロセス終了は
kill (プロセス番号)
kill
コマンドは「シグナルを送るコマンド」
- シグナルは色々あり、終了、停止、再起動などがある
- その中で終了を意味する
SIGTERM
がデフォルト値になっているため kill(プロセス番号)でプロセスが終了する。 ctrl +c
やctrl +z
も同様にシグナルを送っている。kill -l
でシグナルを一覧できる。9:SIGKILL
はカーネルのプロセスを直接停止する。そのためまずは通常のSIGTERMで停止をした方が安全。
<標準入出力とパイプライン>
stdin=標準入力
とstdout=標準出力
とstderr=標準エラー出力
- これらの
標準入出力
はシェルで変更 =リダイレクト < (ファイル)
をすることでコマンドにファイルの内容を入力> (ファイル)
をすることでファイルに出力出力>
をファイルに出力した場合、エラーは端末に出力されるため処理の結果が正常かエラーかがわかる。- エラーメッセージは2>を使った出力する。
>
と2>
を同時に設定することもできる。- メッセージを 2>&1と設定すると標準出力と標準エラー出力を同じファイルに出力できる。 $ ls /xxxxx > resul.txt 2>&1
1
は標準出力、チャンネル番号は0
標準入力、2
標準エラー出力>>
で上書きをせずに追記をするset -o noclobber
でリダイレクトでの追記を防止できる
dev/null
dev/null
に入力、入力を空にするdev/null
に出力、消えてなくなる
パイプライン
less
は標準出力のみ受け付けるのでエラー出力を入力する場合2>&1 | less
を使用する。
フィルタ
head
デフォルトでファイル内の行頭10行を出力(n
オプションで行数を指定)tail
デフォルトでファイル内の末尾10行を出力(n
オプションで行数を指定)grep
指定した検索パターンの結果を出力sort
順番にならべかえるuniq
重複した行を取り除くtac
逆順に出力するwc
行数やバイト数を出力する
tailコマンドで末尾への追記を監視する
tail
は実行すると終了するまで止まらない
sed
コマンド 文字の置換
- Stream Editor 非対話型エディタ
- 編集操作を指定し、標準出力に出力する
awk
- テキストの編集操作を行うが、sedよりももっと高度な処理を行う
.source
コマンド.
コマンンド
- ファイルの記述をそのまま実行する。