エンジニアが英語できるようになりたい

本よむとおいしい情報が得られる

Created: 2018-01-02

8 mile という映画を半分字幕なしで見ました。

全然聞き取れません。 はやく聞き取れるようになりたいのですが、なかなか難しいです。

Software Design という本にシェルスクリプトのネタがあったので、学んだ Tips を書いておこうと思います。

ヒアドキュメント

標準入力にリダイレクトしてくれるので、以下のようなことができます。

$ cat <<EOF > foo.txt
heredoc else> hello
heredoc else> sam
heredoc else> EOF

$ cat foo.txt
hello
sam

インデントの扱いがきになるところですよね?なにも考えずにスクリプト内に書こうとすると以下のようになります。

if [ true ]; then
	cat <<EOF
		hello
		sam
EOF
fi

しかもこれは出力される hello の前には 2 タブが入ります。 コードが見辛いですね。 なので、 <<-EOF を使います。これを使うと、行頭のタブを無視してくれます。つまり以下のようになります。

if [ true ]; then
	cat <<-EOF
		hello
		sam
	EOF
fi

気持ちがよいですね。これは ruby とかと同じような感じですね。

引数の長さには限界がある

$ getconf ARG_MAX
262144

なので、それを超える引数を渡すとエラーになります。たとえば、長い名前のファイル数が大量にあって、 cp ./*.txt foo など。

ということで、まずは長い名前のファイルを大量に作りたいと思います。

$ for i in `seq 10000`; do; name=`printf 'a%.0s' {1..100}`; touch ${i}_${name}.txt; done

上は 30 秒くらいかかるかもしれません。 printf が難しいですね。

$ mkdir hoge
$ cp ./*.txt hoge
zsh: argument list too long: cp

無事にエラーを出すことができました。

本当はこのあとに回避方法があるはずなのですが、どうも -t オプションが使えないみたいでだめでした。 謎です。

$ ls | xargs cp -t ./hoge
cp: illegal option -- t

しかたないので、 rm で同じようなことをしておきました。

# 動かない
$ rm -fr ./*
# うごく
$ ls | xargs rm -fr

デバッグ方法

デバッグしやすい言語が好きです。 これまではシェルスクリプト書くときに全く意識したことがなかったのですが -xv オプションに出会ったので今後はつかって行きたいです。

$ cat sample.sh
for i in `seq 1 5`; do
	touch a_${i}.txt
done
$ sh -xv sample.sh
for i in `seq 1 5`; do
	touch a_${i}.txt
done
seq 1 5
++ seq 1 5
+ for i in '`seq 1 5`'
+ touch a_1.txt
+ for i in '`seq 1 5`'
+ touch a_2.txt
+ for i in '`seq 1 5`'
+ touch a_3.txt
+ for i in '`seq 1 5`'
+ touch a_4.txt
+ for i in '`seq 1 5`'
+ touch a_5.txt

こんな具合です。

$ sh -xv sample.sh 2>&1 | nl -w2
 1	for i in `seq 1 5`; do
 2		touch a_${i}.txt
 3	done
 4	seq 1 5
 5	++ seq 1 5
 6	+ for i in '`seq 1 5`'
 7	+ touch a_1.txt
 8	+ for i in '`seq 1 5`'
 9	+ touch a_2.txt
10	+ for i in '`seq 1 5`'
11	+ touch a_3.txt
12	+ for i in '`seq 1 5`'
13	+ touch a_4.txt
14	+ for i in '`seq 1 5`'
15	+ touch a_5.txt

こんなおしゃれな方法もあります。