ShellScript
Linux
Ubuntu

Linuxに関わる人が一度は読むべきStackOverflowまとめ

More than 3 years have passed since last update.

Linuxに関わる人が一度は読むべきStackOverflowまとめ

  • なぜStackOverflowか
    • Upvote/Downvoteの仕組みにより、自然とベストプラクティスが蓄積されている
    • 世界中のプログラマの目に晒されているため質が高い
    • 答えが幾つか出されているため視野が広がる・一つの手法に固執することがない
    • 英語の勉強にもなる
  • StackOverflowのおすすめの見方
    • 質問はまずしっかり理解する
    • それに対する答えを比較してみて、なぜそう動くのかを考える
    • コメント欄はFont Size的には小さいが、かなり濃いコメントが書かれていることが多いので暇なら目を通す

10. Looping through the content of a file in Bash?

ファイルの内容をループで取得するためのベストプラクティス。

(2015/10/23 : 本節修正しました。@heliac2000 さん、@kawazさん、ありがとうございました。詳しくは本記事コメント欄をご参考ください。 )

while IFS='' read -r p; do
    print "%s\n" "$p"
done < "$1"

たとえば、以下のようにfunctionにして使うと便利です。

##########################
# print_file
#   Print all lines of file
##########################
print_file () {
  while IFS='' read -r p; do
    echo "$p"
  done < "$1"
}

# 以下のように使います
print_file README.md

9. Vim and Ctags tips and tricks

今はStackOverflowの方向転換にともなって「off-topic」扱いだが、
過去の世界中のtipsが集まっている。下手にブログ記事探すより効率的でもある。

8. How do I prompt for input in a Linux shell script?

プロンプトの入力を受け付けてそれをもとに条件分岐する方法。
シェルスクリプトを書いたことがないユーザでもよく目にするやつ。
シェルスクリプトを書き始めた人は、一度はググったのではないかと思います。

read -pで変数に格納したものを、caseで条件分岐、がメジャーな方法ですね。
連続して入力を受け付けたい時はwhile true;というのも、よく使います。

while true; do
    read -p "Do you wish to install this program?" yn
    case $yn in
        [Yy]* ) make install; break;;
        [Nn]* ) exit;;
        * ) echo "Please answer yes or no.";;
    esac
done

7. How do I use sudo to redirect output to a location I don't have permission to write to?

これもたくさんシェルスクリプトを書いていると一度は手が止まる箇所。
「リダイレクトの際に、sudo使わないと発動できないコマンドがあるのだけど」という時の解決方法。

このpostのいいところは、ベストアンサーさんがいくつも手法を紹介している点です。

# 1. Run a shell with sudo and give the command to it by using the -c option:

$ sudo sh -c 'ls -hal /root/ > /root/test.out'

# 2. Create a script with your commands and run that script with sudo:

#!/bin/sh
ls -hal /root/ > /root/test.out

# 3. Run sudo ls.sh. See Steve Bennett's answer if you don't want to create a temporary file.
sudo bash <<EOF
ls -hal /root/ > /root/test.out
EOF

# 4. Launch a shell with sudo -s then run your commands:

[nobody@so]$ sudo -s
[root@so]# ls -hal /root/ > /root/test.out
[root@so]# ^D
[nobody@so]$

# 5. Use sudo tee (if you have to escape a lot when using the -c option):

sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null

6. Pipe to/from Clipboard

クリップボードに出力をコピーしたい時など、よくありますよね。
シェルスクリプトなどを書いていて、これをコマンドで出来たらすごくいい、と思う瞬間はあります。

この記事のいいところは、ベストアンサーさんが
Macだけ、Linuxだけではなく、いろいろなプラットフォームでのやり方を纏めてくれているので
便利です。

In case of X, yes, there's xclip (and others). xclip -selection c will send data to the clipboard that works with Ctrl-C, Ctrl-V in most applications.

If you're trying to talk to the Mac OS X clipboard, there's pbcopy.

If you're in Linux terminal mode (no X) then maybe you need to look into gpm.

There's also GNU screen which has a clipboard. To put stuff in there, look at the screen command "readreg".

Under Windows/cygwin, use /dev/clipboard

5. How can I write a here doc to a file in Bash script?

もちろん、基本的なヒアドキュメントの使い方なんぞご存知のかたばかりだと思いますが、
ニッチな使い方やはまりがちな観点を抑えておきましょう。
「あれ、これでよかったっけな」という時に、このポストを見るといいかもしれません。

4. How is linux kernel tested?

カーネルの話。Wikipediaや参考書などでカーネルについて知識は得たけれど、
実際の開発のイメージがつかなかったり、参考リンクなどを見たかったりする場合におすすめ。

The linux kernel has a heavy emphasis on community testing.

Typically any developer will test their own code before submitting, and quite often they will be using a development version of the kernel from Linus, or one of the other unstable/development trees for a project relevant to their work. This means they are often testing both their changes and other people's changes.

3. How to measure actual memory usage of an application or process?

「本当のメモリ使用量」を取得するためのコマンドに関する議論。
自分はこれを読むまで、psで取れているのだとばっかり勘違いしてました。。。

大体の場合はpsでも良いのだろうけれど、背景でなにがどう動いていて、
正確にはどんなデータを出力しているのか、知っていおくことが大事なのだと考えさせられた良い記事でした。

Why ps is "wrong"

Depending on how you look at it, ps is not reporting the real memory usage of processes. What it is really doing is showing how much real memory each process would take up if it were the only process running. Of course, a typical Linux machine has several dozen processes running at any given time, which means that the VSZ and RSS numbers reported by ps are almost definitely "wrong".

2. How to set chmod for a folder and all of its subfolders and files in Linux Ubuntu Terminal?

ディレクトリの中で特定のファイルを再帰的にchmodで変更したい時に使う。

# To change all the directories to 755 (-rwxr-xr-x):
$ find /opt/lampp/htdocs -type d -exec chmod 755 {} \;

# To change all the files to 644 (-rw-r--r--):
$ find /opt/lampp/htdocs -type f -exec chmod 644 {} \;

1. Finding all files containing a text string on Linux

「ディレクトリから特定の文字列を含むファイルをすべて抽出する」ためのコマンドについての質問。
IntelliJの「Search Everywhere」のような機能ですね。
IDEとか使っていると普通に備えられたりしている、テキストファイルの中身の横断検索。
これ、Linuxのコマンドでどうやるのか、Linux触り初めの頃結構調べた記憶があります。

答えから言うと、こちら。

##########################
# grep
#   -r : 再帰的にgrepコマンドを実行する
#   -n : 行番号を出力する
#   -w : 文字列全体にマッチする場合
#   -l : これをつければファイル名だけを出力(マッチした部分は省く)
#   -i : 大文字小文字を区別する
#
# Usage
#   # 現在いるディレクトリ配下から「httpd」という文字列を含むファイルすべてを抽出する
#   $ grep -rnw . -e "httpd"
##########################
$ grep -rnw 'directory' -e "pattern"

# 特定の拡張子をもつもののみ
$ grep --include=\*.{md,txt} -rnw 'directory' -e "pattern"

(また、タイトルが誤解を招いてしまう表現でしたので、修正しました。「開発者」に限定するのであれば、StackExchange系列で限って見るだけでもSuperUserやServerFaultなど、より適切なサイトが有りました。)