ip コマンドで ifconfig/ifdown/ifup 相当のことをするための覚書
概要
ip コマンドの使い方を毎回忘れるので覚書
ifconfig
$ ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.103 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::8993:6c4d:1cb:6e8d prefixlen 64 scopeid 0x20<link>
ether 08:00:27:dc:d8:e3 txqueuelen 1000 (Ethernet)
RX packets 1696 bytes 210497 (205.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 822 bytes 90988 (88.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 32 bytes 2592 (2.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 32 bytes 2592 (2.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
...
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:dc:d8:e3 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.103/24 brd 192.168.0.255 scope global noprefixroute dynamic enp0s3
valid_lft 162574sec preferred_lft 162574sec
inet6 fe80::8993:6c4d:1cb:6e8d/64 scope link noprefixroute
valid_lft forever preferred_lft forever
...
ifconfig で特定のデバイスの情報を表示する場合
$ ifconfig enp0s3
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.103 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::8993:6c4d:1cb:6e8d prefixlen 64 scopeid 0x20<link>
ether 08:00:27:dc:d8:e3 txqueuelen 1000 (Ethernet)
RX packets 1825 bytes 221661 (216.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 887 bytes 103090 (100.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
$ ip addr show enp0s3
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:dc:d8:e3 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.103/24 brd 192.168.0.255 scope global noprefixroute dynamic enp0s3
valid_lft 162454sec preferred_lft 162454sec
inet6 fe80::8993:6c4d:1cb:6e8d/64 scope link noprefixroute
valid_lft forever preferred_lft forever
ifdown
$ sudo ifdown enp0s3 $ sudo ip link set enp0s3 down
ifup
$ sudo ifup enp0s3 $ sudo ip link set enp0s3 up
[おまけ] NIC の状態を確認する
$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:dc:d8:e3 brd ff:ff:ff:ff:ff:ff
...
シェル変数の値を置換する方法
概要
シェルスクリプトで変数の値を置換する方法のメモ
方法
#!/bin/bash
tmp="hoge fuga piyo"
test=${tmp//hoge/123}
echo ${test} # 123 fuga piyo になる
Makefile のメモ書き
概要
Makefile のメモ書き
subst でオブジェクトファイル名を生成する代わり
source = hoge.cpp fuga.cpp piyo.cpp
# 今まで subst でこう書いてた
objects = $(subst .cpp,.o,${source})
# これでもいい
objects = $(source:.cpp=.o)
シェルスクリプトにおいてバックエンドで実行したコマンドの同期を取る方法
概要
シェルスクリプトでは wait コマンドにプロセス ID を指定することで同期がとれる
wait コマンドのサンプル
sleep コマンドをバックグラウンドで実行させ,wait コマンドで同期をとる
バックグランドで実行したコマンドのプロセス ID は $! で取得できる
#!/bin/bash
for ((i=0; i<3; i++))
do
sleep 5 &
array[i]=$!
echo "Sleeping: ${i} : ${array[i]}"
done
wait ${array[@]}
echo "Finish!!"
シェルスクリプトで同期を取るサンプルコード
シェルスクリプト内で別のシェルスクリプトをバックグラウンドで実行し,終了の同期をとる
また,プロセス ID は重複しないはずなので配列の添字にも使える.
run.sh
#!/bin/bash
./myshell1.sh &
array[$!]=$!
./myshell2.sh &
array[$!]=$!
./myshell3.sh &
array[$!]=$!
wait ${array[@]}
echo "Finish"
myshell{1, 2, 3}.sh
#!/bin/bash echo "$0: Sleeping..." sleep 5
実行方法と結果
$ ./run.sh ./myshell1.sh: Sleeping... ./myshell2.sh: Sleeping... ./myshell3.sh: Sleeping... Finish
[余談] 別のファイルにしないでバックグラウンドで実行する場合
グループ化してバックグラウンドで実行すれば良い
#!/bin/bash
{
echo "Sleeping1..."
sleep 5
} &
array[$!]=$!
{
echo "Sleeping2..."
sleep 5
} &
array[$!]=$!
{
echo "Sleeping3..."
sleep 5
} &
array[$!]=$!
wait ${array[@]}
echo "Finish"
LD_LIBRARY_PATH の設定方法をあれこれ考える
概要
シェルスクリプト内で LD_LIBRARY_PATH を設定することを考える.
LD_LIBRARY_PATH が設定されていない状態で,以下の方法で設定すると末尾に ":" がつくため気持ち悪い
// もちろん動作には影響を与えないので,問題はないはずだが...
#!/bin/bash
# LD_LIBRARY_PATH は空とする
export LD_LIBRARY_PATH=/usr/local/lib64:${LD_LIBRARY_PATH}
echo ${LD_LIBRARY_PATH} # /usr/local/lib64: が表示されるはずだが,末尾の : が気になる
:${パラメータ:+<値>} を使う
パラメータが空文字以外に設定されている場合,パラメータに値を代入する
#!/bin/bash
LD_LIBRARY_PATH=/usr/local/lib64${LD_LIBRARY_PATH:+;}${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH
if でがんばる
if [ -z 文字列 ]; は文字列が空文字の場合に真になる
#!/bin/bash
if [ -z ${LD_LIBRARY_PATH} ]; then
export LD_LIBRARY_PATH=/usr/local/lib64
else
export LD_LIBRARY_PATH=/usr/local/lib64:${LD_LIBRARY_PATH}
fi
[余談] : ${パラメータ:=<値>} を使う
パラメータが空の場合もしくは設定されていない場合に,パラメータに値を代入する
ただし,この方法ではパラメータに追加ができないので,LD_LIBRARY_PATH の設定には不向きである
#!/bin/bash
: ${LD_LIBRARY_PATH:="/usr/local/lib64"}
export LD_LIBRARY_PATH${パラメータ:-<値>} が上記と同じ動作となる
#!/bin/bash
LD_LIBRARY_PATH=${LD_LIBRARY_PATH:-/usr/local/lib64}
export LD_LIBRARY_PATH
PIPESTATUS でパイプラインの各コマンドの終了ステータスを取得する
概要
$PIPESTATUS を使うことでパイプラインの各コマンドの終了ステータスを取得できる.
ただし,使用できる環境には制限がある模様.
$? で終了ステータスを取得する場合の問題点
$? で終了ステータスを取得した場合は一番右のコマンドの終了ステータスを取得する.
$ ./configure 2>&1 | tee _configure.log $ echo $? # tee の終了ステータスが表示される
$PIPESTATUS を使う場合
上記のサンプルで ./configure の終了ステータスをみたい場合は $PIPESTATUS を使う.
$ ./configure 2>&1 | tee _configure.log
$ echo ${PIPESTATUS[0]} # configure の終了ステータスが表示される
また,全コマンドの終了ステータスをまとめて取得したい場合は以下のようにする.
$ echo ${PIPESTATUS[@]}
$PIPESTATUS を使ったサンプルコード
#!/bin/bash
./configure 2>&1 | tee _configure.log
if [ ${PIPESTATUS[0]} = 0 ]; then
echo "configure: success"
else
echo "configure: failed"
exit 1
fi
make 2>&1 | tee _make.log
if [ ${PIPESTATUS[0]} = 0 ]; then
echo "make: success"
else
echo "make: failed"
exit 2
fi
make check 2>&1 | tee _make_check.log
if [ ${PIPESTATUS[0]} = 0 ]; then
echo "make check: success"
else
echo "make check: failed"
exit 3
fi
make install 2>&1 | tee _make_install.log
if [ ${PIPESTATUS[0]} = 0 ]; then
echo "make install: success"
else
echo "make install: failed"
exit 4
fi
[余談] がんばるのがダルイ ログだけが欲しい場合
グループ化してまとめてログを出すだけでもいいかもしれない
{
./configure
make
make check
make install
} 2>&1 | tee _build.log