rpmファイルの依存関係を調べる
rpmファイルを指定して依存関係を調べる方法。
rpm -qpR ファイル名
$ rpm -qpR pg_bigm-1.2.20161011-1.pg96.el6.x86_64.rpm libc.so.6()(64bit) libc.so.6(GLIBC_2.2.5)(64bit) postgresql96-libs rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rtld(GNU_HASH)
既に存在しないディレクトリでコマンドを実行したときのエラー
ターミナルで作業中に、カレントディレクトリが他プロセスにより削除された後でコマンドを打つとエラーになることがあります。
冷静にメッセージを見れば察しはつくのですが、余裕がない時に起きるとちょっとビックリする。
pwd
コマンドは削除済みのフォルダであっても特にエラーにならない
$ ls /tmp #/tmp以下にディレクトリは存在しない $ pwd /tmp/work
- ファイルやディレクトリを作成する系のコマンド
$ mkdir hoge mkdir: cannot create directory `hoge': No such file or directory $ touch hoge touch: cannot touch `hoge': No such file or directory
- psqlコマンド
$ psql
could not identify current directory: No such file or directory
could not identify current directory: No such file or directory
/usr/bin/psql: could not find own program executable
- javaコマンド
$ java version Error occurred during initialization of VM java.lang.Error: Properties init: Could not determine current working directory. at java.lang.System.initProperties(Native Method) at java.lang.System.initializeSystemClass(System.java:1166)
- npmコマンド
npm --version path.js:1163 cwd = process.cwd(); ^ Error: ENOENT: no such file or directory, uv_cwd at Object.resolve (path.js:1163:25) at Function.Module._resolveLookupPaths (module.js:408:17) at Function.Module._resolveFilename (module.js:480:22) at Function.Module._load (module.js:437:25) at Module.require (module.js:513:17) at require (internal/module.js:11:18) at /root/.nodebrew/node/v8.1.3/lib/node_modules/npm/bin/npm-cli.js:19:21 at Object.<anonymous> (/root/.nodebrew/node/v8.1.3/lib/node_modules/npm/bin/npm-cli.js:92:3) at Module._compile (module.js:569:30) at Object.Module._extensions..js (module.js:580:10)
pg_dumpのZオプションで作ったファイルの解凍&リストアにいつも混乱する
pg_dumpコマンドに、 -Z 9
のようにZオプションを与えるとダンプファイルがgzipで圧縮できます。
$ pg_dump -f /mydb.sql -Z 9 mydb
-F
でフォーマットを指定しない場合、plain形式(要はSQLファイル)でダンプ&gzipで圧縮されるだけなんですが、なぜか私は「pg_restoreでリストアしなきゃ」という思考回路になっているようですorz
一瞬混乱した後に、gunzipして解凍しなきゃと思うのですが、今度は次の問題にハマります。
$ gunzip mydb.sql
gzip: mydb.sql: unknown suffix -- ignored
メッセージの通り、拡張子が .gz
じゃないとNGってだけなんですが、これも一瞬???となります。
別に拡張子なんてなんでも良いだろと思うのですが、、、 次からは素直に.gzで出力しよう。
こんなことでハマるのは私だけと思いますが、2度もハマったのでメモしておきました。
bashのpipefailオプション
以前から set -e
を使って、エラー時に実行を止めるシェルをよく書いてましたが、
パイプでコマンドを繋げた場合、最後のコマンドにしか効かないことを今更ながら知ったのでメモ。
例えば、以下のシェルはsl
なんてコマンドは存在しないので、そこでエラーになり止まると思いきや、、、
#!/bin/bash set -e sl | echo "パイプの最後のコマンド" echo "戻り値を確認:$?" echo "ここには来ないはず"
後続の処理が実行されてしまいました。
$ bash /tmp/sete.sh パイプの最後のコマンド /tmp/sete.sh: 行 5: sl: コマンドが見つかりません 戻り値を確認:0 ここには来ないはず
パイプの最後のechoが正常終了してるので、パイプ実行直後の$?
が0となり後続が実行されるようです。
次にset -e
の行をset -eo pipefail
に変えて実行してみます。
$ bash /tmp/sete.sh
/tmp/sete.sh: 行 5: sl: コマンドが見つかりません
パイプの最後のコマンド
今度はパイプの最後までは実行されるが、後続処理は実行されませんでした。
上記を実行直後に$?
を確認すると、コマンドが見つからない旨のエラーコード127が返っているので処理が止まるようです。
今度は、2箇所でエラーになるように絶対にヒットしないgrep detarame
を追加してみます。
sl | grep detarame | echo "パイプの最後のコマンド"
$ bash /tmp/sete.sh
パイプの最後のコマンド
/tmp/sete.sh: 行 5: sl: コマンドが見つかりません
こんどは実行直後の$?
は1だったので、最後にエラーになったgrepコマンドの戻り値がパイプの戻り値になるようです。