読者です 読者をやめる 読者になる 読者になる

座敷牢日誌

都落ちした元SEがソフトウェアやネット関連のことを書いています

mktempコマンドを活用しよう

Linux

mktemp コマンドは一時ファイルあるいはディレクトリを作成するコマンドです.

何か試したいときに, 邪魔にならないディレクトリに適当なディレクトリを作って, カレントディレクトリを変更して……. といった手順や管理を少し簡単にできるかもしれません.

僕の mktemp コマンドの活用方法を紹介します.

ホームディレクトリに tmp ディレクトリを作っておく

mktemp コマンドは, /tmp に一時ファイル/ディレクトリを作成します. それでもいいのですが, root所有のディレクトリ内で作業するのが, 精神衛生上よくない気がしているので, ホームディレクトリ下に tmp ディレクトリを作っています.

$ mkdir $HOME/tmp

mktempのエイリアスを作る

ホームディレクトリに作った tmp ディレクトリを使うように, mktemp コマンドのエイリアスを作っておきましょう.

$ alias mktemp='mktemp -p $HOME/tmp'

ログインシェルの設定ファイルへ追記しておくのがオススメです.

一時作業用のディレクトリを作る

個人的には, 一時ファイルをコマンドによって作りたい状況はほとんどないので, ディレクトリを使う手順を紹介します.

mktemp -d で一時ディレクトリが作成されます.

$ mktemp -d
/home/kosuke/tmp/tmp.bMPBAmdwfT
$

コマンド実行したあとに出力されているのが, 作成されたディレクトリのパスです. しかし, このあとカレントディレクトリを変更しないといけませんから, cd $(mktemp -d) のように実行するのがいいかと思います.

$ cd $(mktemp -d)
$ pwd
/home/kosuke/tmp/tmp.vBYTczzCbC
$

一時ディレクトリの作成とカレントディレクトリの変更を一度に行うことができます.

LinuxのログインシェルをPowerShellへ変更する

PowerShell

せっかくLinuxPowerShellが使えるようになったのですから, 活用したいものですね. 手始めにログインシェルをPowerShellに変えてみてはいかがでしょうか. chsh -s /usr/bin/powershell で変更できます.

user1@1093d1e33f26:~$ chsh -s /usr/bin/powershell
Password:
user1@1093d1e33f26:~$ exit
[root@1093d1e33f26 ~]#
[root@1093d1e33f26 ~]# su user1
PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.
PS /home/user1>

この通り, PowerShellがログインシェルになりました.

Microsoft提供のDockerイメージで確認しました. うまくいかない場合は, /etc/shellsPowerShellのインストール先を確認するのがいいかと思います 1.

ちなみに私は自分の環境でPowerShellを普段使いしているわけではないので, あしからず……. Windowsbashを使いたいニーズがあるのは, CygwinMinGWや, Windows 10へのbash導入といったニュースを見ていればわかりますが, PowerShell on Linux はどうなんでしょうね. メリットは多くあるとは思いますが.


  1. GitHubにあるMicrosoftPowerShellリポジトリで配布しているdebなどのパッケージで導入しているなら, インストール先は /usr だと思います

bashで * が意図しないワイルドカード展開される場合の対処

シェル

C言語ソースコードの1行の文字数を80までにする必要があって, チェックツールなどが用意されているわけではなかったので, bashでチェックしようとしてハマったこと.

#!/usr/bin/env bash
row=1
while read line; do
    chars=$(($(echo $line | wc -c) - 1))
    if [ $chars -gt 80 ]; then
        printf "filename %s, row %d, characters %d\n" "$1" $row $chars
    fi
    row=$(($row + 1))
done < <(iconv -f UTF-8 -t CP932 $1)

こんな感じのスクリプトを用意して, 80文字を超える行があったら, そのファイル名と行番号と文字数を出力しようとしていたが, 文字数が80文字を大きく超過した行が大量に出てきた.

なんでかなあと思ったら, *ワイルドカードとして展開されていた. line 変数の中身が /* だとすると, / 直下のアイテムが列挙されているということ.

#!/usr/bin/env bash
while read line; do echo $line; done <<EOF
/*
EOF

このようなスクリプトを実行すると, 次のように出力されてしまう.

/bin /boot /dev /etc /home /lib /lib64 /lost+found /mnt /opt /proc /root /run
/sbin /srv /sys /tmp /usr /var

回避するには, $line をダブルクォートでくくってやればよい.

#!/usr/bin/env bash
while read line; do echo "$line"; done <<EOF
/*
EOF

これで, /* と出力されるようになるから, ここから文字数の評価もできるようになる. ちなみにシングルクォートでくくると, $line と出力されるようになる.

シェルのクォーティングの有無による挙動の違いってすぐに忘れてしまう.