20190209のLinuxに関する記事は5件です。

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 ssh 

rmコマンド

ファイル削除で使うコマンドですね。
ファイルを削除する際に問い合わせる-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.rb

Railsのマイグレーションコマンド

これも地味に長いので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
}

使い方はこんな感じ。第一引数にstupdoを指定、第二引数に操作したいマイグレーションファイルのバージョンを指定する。

まとめ

思ったより登録してるコマンドが多くなかったですorz...
こんな感じで自分で使いたいコマンドをどんどん登録していくと便利になります。
参考にして見てください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 ready
iwconfig
$ 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:0

APへの接続設定 (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:0
ifconfig
$ 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

参照

https://github.com/diederikdehaas/rtl8812AU

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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/zsh

bashの場合

いくつかファイルがありますが、ざっくりと以下のように使い分けられています。
結論から言うと~/.bashrcに記述すれば良いです。

  • ~/.bash_profile : シェルへのログイン時に存在していれば読込まれる設定ファイル。ログイン時に一度実行されれば良い処理を書くので、環境変数を定義するexport処理とかを記述。
  • ~/.bashrc : シェルを起動するたびに読み込まれる設定ファイル。基本的にはこのファイルに書けばいい。
  • ~/.bash_logout : シェルからのログアウト時に毎回読込まれる設定ファイル。ログアウトする時に実行したい処理はこちらに記述する。

zshの場合

ファイル名以外は殆どbashと同じなので書く意味ないかも。
結論から言うと~/.zshrcに記述すれば良いです。

  • ~/.zprofile : シェルへのログイン時に存在していれば読込まれる設定ファイル。ログイン時に一度実行されれば良い処理を書くので、環境変数を定義するexport処理とかを記述。
  • ~/.zshrc : シェルを起動するたびに読み込まれる設定ファイル。基本的にはこのファイルに書けばいい。
  • ~/.zlogout : シェルからのログアウト時に毎回読込まれる設定ファイル。ログアウトする時に実行したい処理はこちらに記述する。

オススメの設定

aliasと関数で幸せになろう(実践編) でまとめました。
個人的に有用だと思う設定をまとめてGistに挙げておいたので、コピって使ってみてください。

まとめ

いかがだったでしょうか?
今まで苦手だったターミナルで、ゴニョゴニョ遊んでみたくなってきたかと思います。

最初は面倒臭いしわけ分からないですが、とにかくコマンドを打ったりこういった便利な機能を試していくことで、必ず使いこなせるようになってきます。

全ては自分が楽をするためと思って、あなたの考える最強の.bashrcを完成させてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WindowsでLinuxのソースを保存してはいけない

Linux Kernelのsource codeにはaux.caux.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を保存してはいけない(戒め)。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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"オプションを使い続けそうです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む