home(h) links(l) memo profile(r)
memo(m) unix関係(u) 基本的なコマンド、文字

基本的なコマンド、文字

日付を返すまたは設定を行う

【書式1】日付を返す
date オプション... "+ 書式指定"

【例】既定の形式で日付情報を出力
shell> date
2009年  5月  7日 木曜日 11:19:45 JST

【例】"2010/01/01 01:02:03" の形式で日時情報を出力
shell> date "+%Y/%m/%d %H:%M:%S"
2010/01/01 01:02:03

【例】"2010/01/01 01:02:03 JST(+0900)" の形式で日時情報を出力
shell> date "+%Y/%m/%d %H:%M:%S %Z(%z)"
2010/01/01 01:02:03 JST(+0900)

オプション

-d, --date=文字列
表示したい日付を指定する。指定がなければ現在の日付時刻を表示する。相対指定で表示対象日時を表示することもできる[13]。以下に事例を挙げる。なお、相対指定の単位(second 、minuteなど)は単数形でも複数形でもいいらしい。
$ echo -n '現在: ';date; \
> echo -n '現在から1秒後: ';date -d '1 second'; \
> echo -n '2016/4/1から1秒後: ';date -d '2016/4/1 1 second'; \
> echo -n '現在から2秒前: ';date -d '2 seconds ago'; \
> echo -n '現在から3分後: ';date -d '3 minute'; \
> echo -n '現在から4分前: ';date -d '4 minute ago'; \
> echo -n '現在から5時間後: ';date -d '5 hour'; \
> echo -n '現在から6時間前: ';date -d '6 hour ago'; \
> echo -n '現在から7日後: ';date -d '7 day'; \
> echo -n '現在から8日前: ';date -d '8 day ago'; \
> echo -n '現在から9週間後: ';date -d '9 week'; \
> echo -n '現在から10週間前: ';date -d '10 week ago'; \
> echo -n '現在から11ヶ月後: ';date -d '11 month'; \
> echo -n '現在から12ヶ月前: ';date -d '12 month ago'; \
> echo -n '現在から13年後: ';date -d '13 year'; \
> echo -n '現在から14年前: ';date -d '14 year ago'
現在: 2016年  4月 12日 火曜日 16:24:18 JST
現在から1秒後: 2016年  4月 12日 火曜日 16:24:19 JST
2016/4/1から1秒後: 2016年  4月  1日 金曜日 00:00:01 JST
現在から2秒前: 2016年  4月 12日 火曜日 16:24:16 JST
現在から3分後: 2016年  4月 12日 火曜日 16:27:18 JST
現在から4分前: 2016年  4月 12日 火曜日 16:20:18 JST
現在から5時間後: 2016年  4月 12日 火曜日 21:24:18 JST
現在から6時間前: 2016年  4月 12日 火曜日 10:24:18 JST
現在から7日後: 2016年  4月 19日 火曜日 16:24:18 JST
現在から8日前: 2016年  4月  4日 月曜日 16:24:18 JST
現在から9週間後: 2016年  6月 14日 火曜日 16:24:18 JST
現在から10週間前: 2016年  2月  2日 火曜日 16:24:18 JST
現在から11ヶ月後: 2017年  3月 12日 日曜日 16:24:18 JST
現在から12ヶ月前: 2015年  4月 12日 日曜日 16:24:18 JST
現在から13年後: 2029年  4月 12日 木曜日 16:24:18 JST
現在から14年前: 2002年  4月 12日 金曜日 16:24:18 JST

年度内年月を示す6桁の数値を表示させる例:

$ i=0;while [ $i -le 11 ];do date -d "2015/04/01 $i month" '+%Y%m';i=`expr $i + 1`;done
201504
201505
201506
201507
201508
201509
201510
201511
201512
201601
201602
201603
-f, --file=ファイル名
-r, --reference=ファイル名
-R, --rfc-2822
-R, --rfc-3339=TIMESPEC

書式指定

分類 指定 内容 値の範囲、例
世紀 %C西暦/100を2桁表示 00-99
%Y西暦を4桁表示 2012
%y西暦の下2桁表示 00-99
%B地域設定に応じた完全月名 January
%b,%h地域設定に応じた省略月名 Jan
%m月を2桁表示 00-12
%d日付を2桁表示 01-31
%e日付を表示(1桁の前は空白がつく) 1-31
%j年通算日付を表示(1桁の前は0がつく) 001-366
曜日 %A地域設定に応じた完全曜日名 Monday, 月曜日
%a地域設定に応じた省略曜日名 Mon, 月
%w曜日番号 0が日曜日、1が月曜日、...、6が土曜日
%H24時制の時を2桁表示 00-23
%I12時制の時を2桁表示 00-11
%k24時制の時を表示(1桁の前は空白がつく) 0-23
%l12時制の時を表示(1桁の前は空白がつく) 0-11
%M分を2桁表示 00-59
%S秒を2桁表示 00-59
時刻 %R"%H:%M "(時:分 )と同じ 12:34
%T"%H:%M:%S "(時:分:秒 )と同じ 12:34:56
%c地域設定に応じた時刻日付表示 金 1/13 13:41:37 2012, Fri Jan 13 13:41:37 JST 2012
%D"%m/%d/%y "(月/日/西暦下2桁)と同じ 01/13/11
時間帯 %z"-/+"+"zzzz"(zは数字)の形式の時間帯(RFC-822形式) +9000
%Z時間帯名(なければ空) JST

引数が指定され、かつその先頭が ‘+’ で始まっておらず、かつ実行者が適切な権限を持っていれば、 date はシステムの時計を引数で指定された時刻・日 付に設定する。 --date および --set の両オプションは、このような引数と一緒に用いることはできない。 --universal オプションをこのような引数とともに用 いると、指定した時刻・日付が (地方時ではなく) 協定世界時のものになる。

【書式2】日付を設定
date オプション... + 書式指定 日付

【例】システム時間を 2010年3月3日 10:00:00 に設定する
shell> date 030310002010.00
2010年  3月  3日 水曜日 10:10:00 JST

日付の書式は"MMDDhhmmCCYY.ss"。

MM
DD日(月内通算)
hh
mm
CC西暦の上2桁(省略可能)
YY西暦の下2桁(省略可能)
ss秒(省略可能)

表示書式はロケール設定に依存するが、環境変数LANGの値を変更するなどしてロケール設定を変更して表示書式を変更することができる。またdateコマンド実行時、一時的にロケールを変更するにはdateコマンドの前にロケール指定をつける[7]

$ date
2012年  9月 19日 水曜日 18:23:12 JST
$ LANG=C date
Wed Sep 19 18:23:17 JST 2012

RHEL 7/CentOS 7ではより詳細な日付情報が表示できる timedatectl というコマンドがある14_1

$ timedatectl
      Local time: 火 2019-03-26 10:14:45 JST
  Universal time: 火 2019-03-26 01:14:45 UTC
        RTC time: 火 2019-03-26 01:14:45
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

表示言語設定

dateコマンドなどの出力内容は言語設定によって変化する。環境変数LANGの値を変更することで言語設定は変更できる。英語なら「LANG=C」、日本語UTF-8なら「LANG=ja_JP.UTF-8」を実行すればいい[12]

システム利用者情報

who <RET>:システム利用者の表示(ログイン名、ログイン先システム名、ログオン日時)
who am i <RET>:自分のログイン名、ログイン先システム名、ログオン日時の表示
id <RET>
【例】
$ who
user     pts/1        2010-10-28 12:00 (123.4.56.178)
$ who am i
user     pts/1        2010-10-28 12:00 (123.4.56.178)
$ id
uid=501(user) gid=501(user) 所属グループ=501(user)

空白

コマンドの前、最後の引数の後の空白は無視される。コマンドと引数、または引数間では区切り文字と見なされる

'、"(クォート)

引数内に空白を含める際、文字列は'(シングルクォート)、"(ダブルクォート)のどちらかで囲む。なお、クォート内に変数があった場合、前者なら変数名そのまま、後者なら変数を設定されている値に置き換える。

【例】
$ hoge='foo';echo '$hoge';echo "$hoge"
$hoge
foo

;(セミコロン)

;(セミコロン)は複数のコマンドを記述する際のコマンド間の区切りに使用できる。クォートの例参照。

`(バッククォート)

`(バッククォート)は、複数の引数をとるコマンドの引数に別のコマンドの返り値を利用したい場合(引数1つならパイプ(|)でOK)。

パイプ

パイプ(|)はあるコマンドの出力結果を別の入力として渡す。 渡される側のコマンドは子プロセスシェルとして呼び出されるため、渡される側のコマンド内で変数を操作してもコマンドが終われば元に戻ってしまう[1]whileなどループ処理で変数を変更する場合などに注意が必要。

プロセス置換

プロセス置換(<())はコマンドの出力結果をファイルとして扱えるようにする[2]

$ diff <(echo "hoge") <(echo "hoge2")
1c1
< hoge
---
> hoge2

結果出力先の制御

ファイルにコマンドの実行結果を出力するにはリダイレクト(>)を用いる。出力先が既に存在した場合は、既存のものが消去され上書きされる。追記したい場合は>>を用いる。

【例1】カレントディレクトリにある、拡張子htmlのファイル名一覧をls.txtというファイルに出力する(既存上書き)。
ls -l *.html > ls.txt
【例2】例1と同じ(但し、既存追記)
ls -l *.html >> ls.txt

なお、上記事例で該当ファイルがない場合エラーとなるが、エラーメッセージは標準ではファイルに出力されず、標準出力(画面)に出力される。標準エラー出力もファイルに出力するには、2>&1を後に指定して、標準エラー出力(2番出力)も標準出力(1番)と同じものにする。

【例3】例1でエラーもファイルに出力
ls -l *.html > ls.txt 2>&1

出力を捨てるにはリダイレクト先として/dev/nullを指定する。

【例4】カレントディレクトリにある、拡張子htmlのファイル名一覧を画面に出力。エラーは出力しない。
ls -l *.html 2>/dev/null
【例5】カレントディレクトリにある、拡張子htmlのファイルがなかった時のエラーのみ画面に出力。
ls -l *.html 1>/dev/null

なお、入出力装置(ファイルディスクリプタ)のうち3つはシステムに予約されている。0番は標準入力(Standard Input、通常はキーボード)、1番は標準出力(Standard Output、通常はディスプレイ)、2番は標準エラー出力(Standard Error Output、通常はディスプレイ)[9]

スクリプトで出力を全てログに書き出す場合など、都度リダイレクト先を書かなくても、リダイレクト先を一時変更してしまう方法もある[10]

# 標準出力、標準エラー出力をそれぞれ3番と4番のデスクリプタにバックアップ
exec 3>&1 4>&2
# 標準出力のリダイレクト先をfooというファイルに変更し、標準エラー出力もそれに合わせる
exec 1>foo 2>&1

# ...
# 標準出力、標準エラー出力を元に戻す
exec 1>&3 2>&4

バックグラウンドで実行

コマンドの末尾に「&」(アンパサンド)を記すとコマンドがバックグラウンドで実行される。実行完了までに時間のかかるスクリプト等を実行する場合、この処置を行うとスクリプト等が終了するのを待つことなく実行中に他の操作ができる。

$ ./heavy_script.sh &
[1] 12345
$ ps ax | grep heavy_script
12345 pts/1    R      0:39 /bin/sh ./heavy_script.sh
12346 pts/1    S+     0:00 grep heavy_script
$  # 実行が終わると、その旨通知される(何か他のコマンドを実行するか、または単にエンターを入力する)
[1]+  Done                    ./heavy_script.sh

ハングアップに反応しないようコマンドを実行(nohup)

nohup コマンドはハングアップシグナルを無視してコマンドを実行する。これによりログアウトした後もバックグランドでコマンドを実行し続けることができる。但し、コマンドを自動的にバックグランドに送る訳ではないので、バックグラウンドで実行するにはコマンドラインの末尾に ‘&’ をつけて、ユーザーが明示的にバックグラウンドへ送る指定をする必要がある。

【書式1】
nohup コマンドや引数
【書式2】標準出力に使用方法のメッセージを出力して正常終了する。
nohup --help
【書式3】標準出力にバージョン情報を出力して正常終了する。
nohup --vertion

【例】./hoge.sh をバックグラウンドで実行(./hoge.log へエラーも含めて出力)
nohup ./hoge.sh > ./hoge.log 2>&1 &

出展:man nohup (GNU Shell Utilities 2.1 18 June 2002)

優先順位を指定して実行

niceコマンドは優先順位を指定してコマンドを実行する。BSD版とGNU版で挙動や指定方法が異なる。[3][4][5][6]

【書式1】優先度を変更して指定したプログラムを実行する
(BSD版)
nice -n 優先度増加量 実行プログラム名 実行プログラムの引数...
(GNU版)
nice オプション 実行プログラム名 実行プログラムの引数...
【書式2】(GNU版のみ)自身が継承したスケジューリング優先度を表示
nice
【書式3】(GNU版のみ)簡単なヘルプを表示して終了する
nice --help
【書式4】(GNU版のみ)バージョン情報を出力して終了する
nice --version
-n 優先度増加量
(GNU版のみ)-優先度増加量
(GNU版のみ)--adjustment=優先度増加量
優先度増加量にはBSD版の場合-20以上20以下の整数、GNU版の場合-20以上19以下の整数で指定する。いずれの場合も数値が小さい程優先順位が高く、指定がない場合の既定値は10。

また、reniceコマンドで実行中プロセスの優先順位の変更することができる[11]


カレントディレクトリを変更(cd)

【書式】ホームディレクトリへ移動
cd
cd ~
※引数無指定時の挙動がMS-DOSのcdとは異なる(MS-DOSはカレントディレクトリを表示するだけ)
【書式】1つ前のディレクトリに戻る
cd -
【書式】指定したディレクトリに移動
cd パス

コマンド一覧表示

ESCを長押しすると以下のような表示が出る。

$ 
Display all 3268 possibilities? (y or n) 

ここで y を入力するとコマンドリストが表示される。

複数ファイル指定

ワイルドカードを使って条件に合うファイルを全て指定することができる。

$ ls
1.txt  abc.jpg   123.txt
$ ls ?.txt
1.txt
$ ls *.txt
1.txt  123.txt

{ } で囲んだ中にファイル名をコンマ区切りで列挙し複数ファイルを指定することができる。

コマンドの別名登録(alias)

aliasはコマンドの別名を登録したり、登録情報を表示したりする。オプション指定をデフォルトで付けることなどに使える。

このコマンドの指定は既定の設定では非対話的シェルでは適用されない。shoptを使ってexpand_aliasesの設定を有効にすれば適用されるようになる。

【書式】登録されている別名設定を表示する
alias
【例】
$ alias
alias ls='ls --color=tty'
alias vi='vim'

【書式】別名を登録
alias 別名='元のコマンド'
【例】cpコマンドでファイルを複製する際、既存であれば実行してよいかの確認を常に行うようにする
alias cp='cp -i'
コマンドのパス(which)
コマンドのパスリスト(whereis)