- 投稿日:2019-02-09T21:07:34+09:00
aliasと関数で幸せになろう(実践編)
はじめに
前回の記事で
alias
と関数
が何であるかと使い方を解説しました。今回の記事では実際に私が登録してるオススメの
alias
と関数
を紹介していきます。ソースだけ欲しい人はGistに挙げてるので、こちらを丸っと
~/.bashrc
や~/.zshrc
にコピーして使ってくださいね。alias編
先ずはaliasから紹介していきます。
コマンド短くする系
docker
とかdocker-compose
コマンドって長くて打つの面倒臭くないですか?
こういった長いコマンドはまとめて短くしちゃいましょうalias d='docker' alias dc='docker-compose' alias h='heroku' alias py='python3' alias wi='which' alias cl='clear' alias to='touch' alias g='git' alias hi='history' alias bu='bundle' alias ra='rails'こんな感じで1文字か2文字くらいにしてます。
lsコマンド
頻繁に使うlsコマンドも良い感じに設定しましょう。
僕は全て表示したいので、詳細表示の
-l
オプションとドットファイルも表示する-a
オプションを同時に使用してます。alias ll='ls -G -al'こんな感じで使い分けてもいいと思います。
alias ll='ls -G -l' alias la='ls -G -a'カラーオプションについて
-G
はMacで使用する際のオプションになってます。
その他のLinuxディストリビューションで使う際は--color=auto
を使用しましょう。cdコマンド
超使用頻度の高い移動コマンドのcdコマンド。
例えば、プロジェクトフォルダや頻繁に移動するフォルダのaliasを登録しておくと便利。alias cdh='cd ~/project/hoge/' alias cdf='cd ~/project/fuga/'親ディレクトリに移動
親ディレクトリに移動することって地味に多いですよね。そんな時に便利なalias。
alias ..='cd ..'grepコマンド
こちらも使用頻度の高いコマンドですね。カラーオプションをつけて見易くします。
alias gr='grep --color'aliasの
-g
オプション因みに、シェルにzshを使用していれば、aliasの
-g
オプションを使ってパイプが使えるようになります。alias -g gr='| grep --color'使い方はこんな感じ。すごーい。
% hi gr ssh 30589 pss sshuttle 30592 pss ssh 30594 ssh-wo 30595 pss sshrmコマンド
ファイル削除で使うコマンドですね。
ファイルを削除する際に問い合わせる-i
オプションを指定します。逆に、一気に消したい時は、ディレクトリも含め再帰的に削除する
-r
オプションと、警告を表示しないで強制的に削除する-f
オプションを使用します。alias rmi='rm -i' alias rmf='rm -fr'設定ファイル操作系
zsh(bash)ファイルでaliasや関数を結構頻繁に追加するので、それもついでにalias書いときます。
書き込み時
ホームディレクトリにある
.zshrc
をvimエディタで編集します。alias viz='vi ~/.zshrc'読み込み時
設定ファイルは書き込んだ後に
source
コマンドで読み込むのを忘れないようにしてください。alias sz='source ~/.zshrc'PATHの確認
環境変数のPATHを確認することも地味に多いので登録しとく。
alias path='echo $PATH'関数編
次にオススメの関数を紹介します。
プロセスの確認
プロセスの確認をするのに便利な関数。
出力結果からgrepコマンドのプロセスを除外して、ヘッダを付与します。
すごいお気に入りの関数。pss () { ps aux | grep -E "PID|$1" | grep -v grep }使い方はこんな感じ。第一引数にgrepしたい文字列を指定する。
% pss ssh USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND me 45486 0.0 0.0 4297712 5716 s000 S+ 6:08PM 0:00.03 ssh wo-hoge文字列検索
対象の文字列が記述されてるファイルを検索する関数。
これもリモートサーバで頻繁に使う。
ローカルだとAtom等のテキストエディタ使ってると、使用する機会は少ないかも。gre () { grep -E $1 -rl $2 }使い方はこんな感じ。第一引数に文字列、第二引数に検索対象のディレクトリを指定する。
% gre session app app/controllers/application_controller.rbRailsのマイグレーションコマンド
これも地味に長いのでCASE式を使って使い易くしましょう。
db() { case $1 in "st") bundle exec rails db:migrate:status ;; "up") bundle exec rails db:migrate:up VERSION=$2 ;; "do") bundle exec rails db:migrate:down VERSION=$2 ;; *) echo "plese give the params st, up, do " ;; esac }使い方はこんな感じ。第一引数に
st
かup
かdo
を指定、第二引数に操作したいマイグレーションファイルのバージョンを指定する。まとめ
思ったより登録してるコマンドが多くなかったですorz...
こんな感じで自分で使いたいコマンドをどんどん登録していくと便利になります。
参考にして見てください。
- 投稿日:2019-02-09T19:50:19+09:00
Raspberry Piで8812AU USB WLANを認識させる
実施環境
- Raspberry Pi 2 Model B
- Raspbian Stretch (2018-11-13-raspbian-stretch-lite.img)
- USB-NIC WL-WN688U3D (chipset: RTL8812AU)…技適がないことが判明して使用不可orz
カーネルバージョン$ uname -a Linux pi2 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l GNU/Linux手順
ソフトウェア更新、インストール
$ sudo apt update && sudo apt upgrade -y $ sudo apt install build-essential git dkmsカーネルソースの取得
$ sudo apt install raspberrypi-kernel-headers $ cd /usr/src/ $ sudo ln -s linux-headers-4.14.79-v7+ linux $ ls -la total 16 drwxr-xr-x 4 root root 4096 Feb 9 06:27 . drwxr-xr-x 10 root root 4096 Nov 13 12:56 .. lrwxrwxrwx 1 root root 25 Feb 9 06:27 linux -> linux-headers-4.14.79-v7+ drwxr-xr-x 24 root root 4096 Feb 9 06:26 linux-headers-4.14.79+ drwxr-xr-x 24 root root 4096 Feb 9 06:26 linux-headers-4.14.79-v7+ドライバーのソースコード取得 (git)
$ pwd /usr/src $ sudo git clone https://github.com/diederikdehaas/rtl8812AU Cloning into 'rtl8812AU'... $ sudo mv rtl8812AU rtl8812AU-4.3.20 ## dkms用にバージョン番号を付けておく $ ls -la total 20 drwxr-xr-x 5 root root 4096 Feb 9 06:28 . drwxr-xr-x 10 root root 4096 Nov 13 12:56 .. lrwxrwxrwx 1 root root 25 Feb 9 06:27 linux -> linux-headers-4.14.79-v7+ drwxr-xr-x 24 root root 4096 Feb 9 06:26 linux-headers-4.14.79+ drwxr-xr-x 24 root root 4096 Feb 9 06:30 linux-headers-4.14.79-v7+ drwxr-xr-x 8 root root 4096 Feb 9 06:31 rtl8812AU-4.3.20ドライバーのビルド・インストール (dkms)
RPi2でコンパイルすると10分程度かかる。
$ pwd /usr/src $ sudo vi rtl8812AU-4.3.20/Makefile ## プラットフォーム指定を変更しておく CONFIG_PLATFORM_I386_PC = n ## y -> n CONFIG_PLATFORM_ARM_RPI = y ## n -> y $ $ DRV_NAME=rtl8812AU $ DRV_VERSION=4.3.20 $ sudo dkms add -m ${DRV_NAME} -v ${DRV_VERSION} $ sudo dkms build -m ${DRV_NAME} -v ${DRV_VERSION} $ sudo dkms install -m ${DRV_NAME} -v ${DRV_VERSION}デバイスの接続
lsusb$ lsusb Bus 001 Device 005: ID 0bda:8812 Realtek Semiconductor Corp. RTL8812AU 802.11a/b/g/n/ac WLAN Adapter Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
dmesg$ dmesg | tail [ 2083.565802] usb 1-1.4: new high-speed USB device number 5 using dwc_otg [ 2083.696418] usb 1-1.4: New USB device found, idVendor=0bda, idProduct=8812 [ 2083.696435] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 2083.696447] usb 1-1.4: Product: 802.11n NIC [ 2083.696457] usb 1-1.4: Manufacturer: Realtek [ 2083.696467] usb 1-1.4: SerialNumber: 123456 [ 2083.864475] RTL871X: rtw_ndev_init(wlan0) if1 mac_addr=80:3f:5d:11:c2:d5 [ 2084.509770] IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not readyiwconfig$ iwconfig wlan0 wlan0 unassociated Nickname:"<WIFI@REALTEK>" Mode:Managed Frequency=2.412 GHz Access Point: Not-Associated Sensitivity:0/0 Retry:off RTS thr:off Fragment thr:off Encryption key:off Power Management:off Link Quality:0 Signal level:0 Noise level:0 Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0APへの接続設定 (rpi-config)
$ sudo raspi-config ## 2 Network Options -> N2 Wi-fi $ cat /etc/wpa_supplicant/wpa_supplicant.conf ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=JP network={ ssid="SSID-NAME" psk="PASSPHRASE" }再起動
$ sudo reboot通信確認
ifconfig$ iwconfig wlan0 wlan0 IEEE 802.11bgn ESSID:"SSID-NAME" Nickname:"<WIFI@REALTEK>" Mode:Managed Frequency:2.472 GHz Access Point: 38:D5:47:07:0E:F8 Bit Rate:144.4 Mb/s Sensitivity:0/0 Retry:off RTS thr:off Fragment thr:off Power Management:off Link Quality=100/100 Signal level=100/100 Noise level=0/100 Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0ifconfig$ ifconfig wlan0 wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.10.7 netmask 255.255.255.0 broadcast 192.168.10.255 inet6 fe80::a668:a947:aa8:1a09 prefixlen 64 scopeid 0x20<link> ether 80:3f:5d:11:c2:d5 txqueuelen 1000 (Ethernet) RX packets 157 bytes 21661 (21.1 KiB) RX errors 0 dropped 22 overruns 0 frame 0 TX packets 33 bytes 5426 (5.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0疎通確認$ ping www.google.com PING www.google.com (216.58.196.228) 56(84) bytes of data. 64 bytes from kix06s01-in-f228.1e100.net (216.58.196.228): icmp_seq=1 ttl=55 time=13.4 ms 64 bytes from kix06s01-in-f228.1e100.net (216.58.196.228): icmp_seq=2 ttl=55 time=20.4 ms 64 bytes from kix06s01-in-f228.1e100.net (216.58.196.228): icmp_seq=3 ttl=55 time=10.4 ms 64 bytes from kix06s01-in-f228.1e100.net (216.58.196.228): icmp_seq=4 ttl=55 time=10.6 ms ^C --- www.google.com ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3004ms rtt min/avg/max/mdev = 10.473/13.756/20.466/4.048 ms参照
- 投稿日:2019-02-09T18:57:14+09:00
aliasと関数で幸せになろう
はじめに
みなさんターミナル使ってますか?
エンジニアになると真っ黒な画面でマトリックスみたいに、コマンドをカタカタ打ってハッカーっぽい行為を毎日のようにするかと思います。
特に、プログラミング初心者の人は教材やスクールで「ターミナル開いて」って言われると、「またかよ、何が悲しくて真っ黒い画面と話さなくちゃなんないんだよ」って気持ちになる人も多いと思います。僕もそうでした
しかしながら、ターミナルでの操作はめちゃくちゃ便利だし、sshとかでリモートサーバーに接続した際は必須のスキルになるので、せめて、aliasや関数を登録してコマンド入力を楽にしましょう
キズナアイのような対話型AIが実装されるその日まで、alaisと関数を使って快適なターミナルライフを実現しましょう。
因みに、オススメの設定は aliasと関数で幸せになろう(実践編) にまとめました。是非使ってみてください。
そもそもなんやねん?
そもそもaliasと関数てなんなのっていう説明と使い方をざっくり説明します。
因みに、これから参照してるコマンド例は全てターミナル上で実行してるので、ターミナルを事前に立ち上げてコマンドを打って動作を確認してみてくださいね。alias
実はaliasもコマンドです。
aliasコマンドはコマンドを別名で登録または、登録されている内容を確認するLinuxコマンドのことです。例えば、下記のように使えます。
% hoge zsh: command not found: hoge % alias hoge='echo "This is alias hoge"' % hoge This is alias hoge %順番に説明すると
hoge
と打ってもhoge
なんてコマンドはないぜ!って怒られる- aliasコマンドを使って
hoge
を登録hoge
がコマンドのように使えるようになる要するにaliasはショートカットみたいなものです。
alias <ショートカット名>='<実行したいコマンド>'
で登録できます。関数
bash関数とかとも言われたりします。
その名の通りシェルスクリプトで書かれた関数のことです。例えば、下記のように使えます。
% hoge zsh: command not found: hoge % hoge() { function> echo "This is function hoge" function> } % hoge This is function hoge %順番に説明すると
hoge
と打ってもhoge
なんてコマンドはないぜ!って怒られるhoge
という名前の関数を定義するhoge
を呼び出せるようになるはい、このように使い方や機能はaliasと似たようなものです。
では、どのような点が違うのかを次の項目で説明します。aliasと関数の使い分け
aliasと関数の使い方について分かったところで、じゃあ、どのようにして使い分けるのかを簡単に説明します。
ただ、明確にこうであるべきって事はないですし、あくまで個人用なのでお好きな方を使う感じで大丈夫ですよ。
aliasを使うべき時
aliasを使うときは主に
単純な処理
やコマンドの上書き
をする時です。例えば環境変数に設定されてる
PATH
を観たい時とかは単純なコマンドですみますよね。% path zsh: command not found: path % alias path='echo $PATH' % path /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
コマンドの上書き
をする場合です。% ls Applications Desktop % alias ls='ls -l' % ls total 324 drwx------@ 3 me staff 96 3 13 2018 Applications drwx------+ 7 me staff 224 9 7 17:45 Desktop個人的には既存のコマンドを破壊的に変える後者のaliasの使い方はあまり好きじゃないので、前者の使い方がほとんどです。
関数を使うべき時
対して関数を使うときは主に
複雑な処理
や引数を使う処理
をする時です。
特に、aliasは引数を使う事はできないので、引数を使うのであれば関数一択です。
複雑な処理
だとアバウトな言い方ですが、個人的には1行以上であれば関数にするべきだと思います。
引数を使う処理
とは下記のような処理のことです。なお、シェルスクリプトの細かい書き方については割愛します。半端ないボリュームになるので。。。% hoge() { function> case $1 in function case> "s") echo "You choose s" ;; function case> "m") echo "You choose m" ;; function case> *) echo "You are normal" ;; function case> esac function> } % hoge s You choose s簡単に説明すると、
$1
には関数に渡した引数が格納されています。今回だとs
ですね。この第一引数で与えられたパラメータに応じてCASE式で実行処理を分けてます。なんとなく予想できたかと思いますが、引数を使える関数の機能がかなり便利なので、よく使う一連の処理を関数で定義しておくと、ターミナル操作が格段に楽になります。
実際の使い方
さてさて、aliasと関数について単体での使い方について説明してきましたが、いちいちターミナルを起動した時にaliasを登録したり、関数を定義したりするのは現実的じゃないですよね。
そこで、こういった処理はホームディレクトリ直下の
.bashrc
や.zshrc
に書いちゃいましょう。そうすればターミナル起動したら自動で読み込んで使えるようにしてくれます。
書き方
.bashrc
などに直接書けば大丈夫です。こんな感じで。%cat ~/.bashrc # alias alias ll='ls -al' alias d='docker' alias dc='docker-compose' # function ssk() { if [ -e ~/tmp/sshuttle.pid ]; then echo "kill sshuttle.pid" kill `cat ~/tmp/sshuttle.pid` fi } gre() { grep -E $1 -rl $2 }どのファイルに書けばいい?
実はこのようなファイルって地味に多くてどのファイルに書けばいいか分からないと思います。
ざっくり下記のような使い分けがされているので参考にしてみてください。因みに、使ってるシェルの種類によって微妙に違うので
echo $SHELL
を実行して自分が使ってるシェルを事前に確認しておいてください。
私の場合はzshを使ってるので以下の出力になります。% echo $SHELL /bin/zshbashの場合
いくつかファイルがありますが、ざっくりと以下のように使い分けられています。
結論から言うと~/.bashrc
に記述すれば良いです。
~/.bash_profile
: シェルへのログイン時に存在していれば読込まれる設定ファイル。ログイン時に一度実行されれば良い処理を書くので、環境変数を定義するexport
処理とかを記述。~/.bashrc
: シェルを起動するたびに読み込まれる設定ファイル。基本的にはこのファイルに書けばいい。~/.bash_logout
: シェルからのログアウト時に毎回読込まれる設定ファイル。ログアウトする時に実行したい処理はこちらに記述する。zshの場合
ファイル名以外は殆どbashと同じなので書く意味ないかも。
結論から言うと~/.zshrc
に記述すれば良いです。
~/.zprofile
: シェルへのログイン時に存在していれば読込まれる設定ファイル。ログイン時に一度実行されれば良い処理を書くので、環境変数を定義するexport
処理とかを記述。~/.zshrc
: シェルを起動するたびに読み込まれる設定ファイル。基本的にはこのファイルに書けばいい。~/.zlogout
: シェルからのログアウト時に毎回読込まれる設定ファイル。ログアウトする時に実行したい処理はこちらに記述する。オススメの設定
aliasと関数で幸せになろう(実践編) でまとめました。
個人的に有用だと思う設定をまとめてGistに挙げておいたので、コピって使ってみてください。まとめ
いかがだったでしょうか?
今まで苦手だったターミナルで、ゴニョゴニョ遊んでみたくなってきたかと思います。最初は面倒臭いしわけ分からないですが、とにかくコマンドを打ったりこういった便利な機能を試していくことで、必ず使いこなせるようになってきます。
全ては自分が楽をするためと思って、あなたの考える最強の
.bashrc
を完成させてください。
- 投稿日:2019-02-09T16:35:09+09:00
WindowsでLinuxのソースを保存してはいけない
Linux Kernelのsource codeには
aux.c
aux.h
が存在します。
git clone
してくると一応保存はできるのですが、その後が困ったことになります。
具体的に言うと、削除すら出来なくなります。どういうこと?
aux
はMS-DOSにおける予約語の一つです。これはWindows10にも適用され、やはり使うことが出来ません。具体的な予約語は以下のとおり。
- CON (CONSOLE)
- PRN (PRINTER)
- AUX (AUXILIARY)
- NUL (NULL)
- COM1-9 (COMMUNICATION PORT)
- LPT1-9 (LINE PRINTER: PARALLEL PORT)
これらは拡張子を付けたとしてもダメで、デバイスをファイルに見立てて操作していた名残なんだとか。
デキちゃったみたいあるんだけど、どうしたらいい?コマンドプロンプトからは、
\\.\C:\フォルダ名\
のような特殊な書式で指定することで扱えます。rmdir
なりdel
なりできます。まとめ
Windowsで他OSのkernel sourceを保存してはいけない(戒め)。
- 投稿日:2019-02-09T16:07:22+09:00
findコマンドの-nameオプションと-pathオプションの違い
はじめに
Linux環境においてfindコマンドはよく使われるコマンドの一つですが、"-name"オプションと"-path"オプションというよく似たオプションがあります。
普段は"-name"オプションばかり使っているので、今回は両者の違いを調べてみました。-nameオプション
find {検索するディレクトリ} -name {検索するキーワード}
- "-name"オプションを付けることで、ファイル名、ディレクトリ名を指定して検索できます。
- 検索するキーワードに"*"を付けることで、ワイルドカードを使った検索が可能です。
- ただし、"-name"オプションの引数にスラッシュを含む場合は検索できないため、例えば"-name {ディレクトリ名}/{ファイル名}"とパラメーターを指定することができません。
[root@kumotori ~]# find /etc -name "ifcfg*" /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-lo[root@kumotori /]# find / -name "/etc/sysconfig/network-scripts/*eth*" find: warning: Unix filenames usually don't contain slashes (though pathnames do). That means that '-name `/etc/sysconfig/network-scripts/*eth*'' will probably evaluate to false all the time on this system. You might find the '-wholename' test more useful, or perhaps '-samefile'. Alternatively, if you are using GNU grep, you could use 'find ... -print0 | grep -FzZ `/etc/sysconfig/network-scripts/*eth*''.-pathオプション
find {検索するディレクトリ} -path "{パターン}"
- "-path"オプションを付けると、パターンにマッチするファイルやディレクトリを検索できます。
- 検索するパターンに"*"を付けることで、ワイルドカードを使った検索が可能です。
- "-path"オプションにはスラッシュを含むパターンを指定できるので、ディレクトリもパターンに含めて検索できます。
[root@kumotori /]# find /etc/sysconfig/ -path "*network-scripts/*eth*" /etc/sysconfig/network-scripts/ifup-eth /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifdown-ethまとめ
- どちらのオプションも「ほぼ同等の機能」になるので、通常の操作ではどちらかを覚えておけば十分だと思われます。
- "-path"オプションの方が検索条件の柔軟性が高いようですが、これまでの癖で"-name"オプションを使い続けそうです。