お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2008-02-07 14:04:27

kubuntu01
新しいメンバ
登録日: 2008-02-07

selectコマンドは、どのパッケージにあるのか?

こんにちは、お世話になります。

kubuntuをインストールした後に、自作のシェルスクリプトを走らせようとしたのですが、『select』コマンドがないとkonsoleに言われました。whichコマンドでチェックしても、確かに『select』コマンドのパスは出てきませんでしたので、インストールはされてないと思います。

selectコマンドは、どのパッケージにあるのでしょうか? また、関連して、『あるコマンドがどのパッケージにあるのか』を調べるのにはどのようにしたらいいのでしょうか?

すみませんが、ご教示のほどをお願いいたします。

オフライン

 

#2 2008-02-07 14:41:50

hito
管理者
登録日: 2007-03-18

Re: selectコマンドは、どのパッケージにあるのか?

selectは通常、bashに組み込みの制御文です。bash拡張です。

スクリプトの最初で/bin/shを呼んでいないでしょうか?

それが今までは何故動いていたかというと他のLinuxだと/bin/shは大抵/bin/bashへの
シンボリックリンクだからです。Ubuntuではdashなのでコケます。

他のLinuxと動作を揃えるには、
$ sudo dpkg-reconfigure dash
で、"Install dash as /bin/sh? "と聞かれるので、noを回答して
dashを/bin/shとして扱わないようにすればOKです。

ただし、この場合は/bin/bashを呼ぶようにするのがシェルスクリプトとしては
適切な実装です。


で、今回の場合は役に立ちませんが、あるコマンドが欲しいがパッケージがわからない
場合は、
http://packages.ubuntu.com/
で検索するのが早いと思います。

オフライン

 

#3 2008-02-07 16:05:24

kubuntu01
新しいメンバ
登録日: 2008-02-07

Re: selectコマンドは、どのパッケージにあるのか?

hito 様、ご解答ありがとうございました。

おっしゃる通り、スクリプトの最初で『/bin/sh』を呼んでました。
『$ sudo dpkg-reconfigure dash』での『no』の選択で見事に解決しました。
Ubuntuはdashを使っていたのも知らなかったです。(知らないってこわいっすね...)

助かりました。おかげで、4日間悩んだことが氷解しました。ubuntu パッケージのページ内の情報も今後活用させてもらおうと思います。

いろいろお世話いただきまして、ありがとうございました m(_ _)m 。

オフライン

 

#4 2008-02-07 16:50:20

hito
管理者
登録日: 2007-03-18

Re: selectコマンドは、どのパッケージにあるのか?

kubuntu01 による投稿:

『$ sudo dpkg-reconfigure dash』での『no』の選択で見事に解決しました。
Ubuntuはdashを使っていたのも知らなかったです。(知らないってこわいっすね...)

え、えーとあの、「正しい解決策は/bin/shではなく/bin/bashにしてください」
というのをしない理由は何でしょう……。

/bin/shとして呼ばれているのにbash拡張が使えてしまうのはbashの悪癖なので、
どこかで闇に葬られる可能性も否定できないのですが……。
(/bin/shとして呼ばれたら、/bin/shで動かないものは使わせないのが正しい挙動。
zshなどではそうなっています)

# まぁ、すでに世の中にそういう「偽/bin/shでしか動かないスクリプト」が
# 無数に存在しているので、そう簡単には変更できないのですが。

オフライン

 

#5 2008-02-07 21:34:24

kubuntu01
新しいメンバ
登録日: 2008-02-07

Re: selectコマンドは、どのパッケージにあるのか?

返信が遅くなってしまいました ...

hito による投稿:

え、えーとあの、「正しい解決策は/bin/shではなく/bin/bashにしてください」
というのをしない理由は何でしょう……。

あっ、そういうことでしたか。直します。すみません (^^;ゞ 。

ぼくがシェルスクリプトの先頭を『#!/bin/bash』にしたくないのは、自分自身の好みだからです。『/bin/bash』より『/bin/sh』の方がlinuxの環境を変えてもつぶしがききそうなイメージですから。

スクリプト内のコマンドが『/bin/sh』の範囲のコマンドで済むのでしたら、先頭を『#!/bin/bash』にしたくないんです。今回はselectというコマンドが『/bin/sh』の範囲で済まないことがわかりましたので、シェルスクリプトの先頭を『#!/bin/bash』に直します。

こんなものでよろしいでしょうか...

オフライン

 

#6 2008-02-09 18:01:21

hito
管理者
登録日: 2007-03-18

Re: selectコマンドは、どのパッケージにあるのか?

kubuntu01 による投稿:

ぼくがシェルスクリプトの先頭を『#!/bin/bash』にしたくないのは、自分自身の好みだからです。『/bin/bash』より『/bin/sh』の方がlinuxの環境を変えてもつぶしがききそうなイメージですから。

スクリプト内のコマンドが『/bin/sh』の範囲のコマンドで済むのでしたら、先頭を『#!/bin/bash』にしたくないんです。今回はselectというコマンドが『/bin/sh』の範囲で済まないことがわかりましたので、シェルスクリプトの先頭を『#!/bin/bash』に直します。

こんなものでよろしいでしょうか...

えーと、/bin/shをそのような目的に使われるのでしたら、各コマンドはフルパスで書くようにした
方がいいかもしれません(セキュリティのためというのもそうですし、今回のようにシェル組み込み
関数を気づかずに使ってしまうことを避けるため)。

あと本質的には関係ないですが、シェルスクリプトの中でIFSを再宣言する、といった古典的な
アプローチも把握しておいた方がいいと思います。
http://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c703.html


あ、あと萎縮しないで頂けると……(汗

オフライン

 

Board footer

Powered by FluxBB