作業ノート

様々なまとめ、雑感など

コマンドの先頭にバックスラッシュをつける理由

RVMをインストールする機会があり、手順を確認してインストールした。

\curl -sSL https://get.rvm.io | bash -s stable

このときcurlの先頭に\がついているのが気になり、付けない場合と何が違うのか調べた。

\つける理由は、shellのエイリアスの影響を受けないようにするため。

エイリアスはある単語を別の単語に置換するためのリスト。コマンドの先頭の単語がこのリストに一致するときに、別の単語に置換する。ただし、その単語がクォートされているときは置換されない。

一方で、\はそのあとの1文字をクォートするエスケープ文字で、\curlは先頭の一文字のみクォートした単語となる。これがエイリアスの条件を満たさないようで、これを狙った記法のようだ。

前述のとおり、単語がクォートされているときは置換されないので、コマンドを

'curl' -sSL https://get.rvm.io | bash -s stable

シングルクォートや

"curl" -sSL https://get.rvm.io | bash -s stable

ダブルクォートで囲んでも同様で、エイリアスは適用されない。

参考

Oracleで「user」という名前のテーブルが作成できなかった

最近、既存システムを刷新することになり、その調査で知ったこと。

Oracleを使用することが決まっていて、プロジェクトの要件、使用するフレームワークなどを確認する過程で、試しにuserという名前のテーブルを作成しようとしたところ、

SQL> create table user (id  number not null, name varchar2(255) not null);
create table user (id number not null, name varchar2(255) not null)
             *
行1でエラーが発生しました。 :
ORA-00903: 表名が無効です。

作成できなかった。試したOracleは12c(12.1.0.2.0)。

他に、カラム名をuserにすると、そのテーブルは作成できない。

SQL> create table foo (id number not null, user varchar2(128) not null);
create table foo (id number not null, user varchar2(128) not null)
                                      *
行1でエラーが発生しました。:
ORA-00904: : 無効な識別子です。

調べたところ、userはSQLの予約語であり、テーブル名などの識別子として使えない。また、この制約は12cに限ったことではない。

Oracleでは、予約語をV$RESERVED_WORDSで確認できる。

SQL> set linesize 150
SQL> col RESERVED format a8
SQL> col RES_TYPE format a8
SQL> col RES_ATTR format a8
SQL> col RES_SEMI format a8
SQL> col DUPLICATE format a8
SQL> select * from V$RESERVED_WORDS where keyword = 'USER';

KEYWORD                            LENGTH RESERVED RES_TYPE RES_ATTR RES_SEMI DUPLICAT     CON_ID
------------------------------ ---------- -------- -------- -------- -------- -------- ----------
USER                                    4 N        N        N        Y        N                 0

リファレンスによると、YになっているRES_SEMIは、DMLなどのSQLで識別子として利用できない、とのこと。

どうしても予約語を使ったテーブルを作成したい場合は、識別子としてみなされないようにするために引用符をつける。

SQL> create table "user" (id number not null, name varchar2(128) not null);

表が作成されました。

SQL> desc "user";
名前                                       NULL?    型
----------------------------------------- -------- ----------------------------
ID                                        NOT NULL NUMBER
NAME                                      NOT NULL VARCHAR2(128)

SQL> create table foo (id number not null, "user" varchar2(128) not null);

表が作成されました。

SQL> desc foo;
名前                                       NULL?    型
----------------------------------------- -------- ----------------------------
ID                                        NOT NULL NUMBER
user                                      NOT NULL VARCHAR2(128)

確かに作成できるが、SQLで指定するときは必ず引用符が必要になる。また、ドキュメントでは、引用符を用いた方法は推奨されていないので、識別子とみなされるワードを使用するのは避けたほうがいい。

参考

curlコマンドでHTTPレスポンスのヘッダを確認する

以前クリックジャッキングの対応で、X-Frame-Optionsヘッダを出力するようにhttpdの設定を変更したが、その確認でcurlを使って確認した時の方法。

$ curl -s -D - http://www.example.com -o /dev/null
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: max-age=604800
Content-Type: text/html
Date: Mon, 03 Aug 2015 15:04:03 GMT
Etag: "359670651"
Expires: Mon, 10 Aug 2015 15:04:03 GMT
Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
Server: ECS (pae/3796)
X-Cache: HIT
x-ec-custom-error: 1
Content-Length: 1270

-sは、curlをサイレントモードで実行する。curlは標準エラー出力に進捗を表示するが、このオプションをつけると表示されない。

-Dは、ヘッダを表示するオプション。このオプションには出力先ファイル名を指定するが、-を指定するとヘッダは標準出力に出力される。

-oは、レスポンスボディをファイルに出力する。オプションを指定しないと標準出力に出力されるが、このオプションに/dev/nullを指定して、標準出力に出力されないようにしている。

参考