
Ubuntu日本語フォーラム

ログインしていません。
こんにちは、お世話になります。
kubuntuをインストールした後に、自作のシェルスクリプトを走らせようとしたのですが、『select』コマンドがないとkonsoleに言われました。whichコマンドでチェックしても、確かに『select』コマンドのパスは出てきませんでしたので、インストールはされてないと思います。
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/
で検索するのが早いと思います。
オフライン
hito 様、ご解答ありがとうございました。
おっしゃる通り、スクリプトの最初で『/bin/sh』を呼んでました。
『$ sudo dpkg-reconfigure dash』での『no』の選択で見事に解決しました。
Ubuntuはdashを使っていたのも知らなかったです。(知らないってこわいっすね...)
助かりました。おかげで、4日間悩んだことが氷解しました。ubuntu パッケージのページ内の情報も今後活用させてもらおうと思います。
いろいろお世話いただきまして、ありがとうございました m(_ _)m 。
オフライン
kubuntu01 による投稿:
『$ sudo dpkg-reconfigure dash』での『no』の選択で見事に解決しました。
Ubuntuはdashを使っていたのも知らなかったです。(知らないってこわいっすね...)
え、えーとあの、「正しい解決策は/bin/shではなく/bin/bashにしてください」
というのをしない理由は何でしょう……。
/bin/shとして呼ばれているのにbash拡張が使えてしまうのはbashの悪癖なので、
どこかで闇に葬られる可能性も否定できないのですが……。
(/bin/shとして呼ばれたら、/bin/shで動かないものは使わせないのが正しい挙動。
zshなどではそうなっています)
# まぁ、すでに世の中にそういう「偽/bin/shでしか動かないスクリプト」が
# 無数に存在しているので、そう簡単には変更できないのですが。
オフライン
返信が遅くなってしまいました ...
hito による投稿:
え、えーとあの、「正しい解決策は/bin/shではなく/bin/bashにしてください」
というのをしない理由は何でしょう……。
あっ、そういうことでしたか。直します。すみません (^^;ゞ 。
ぼくがシェルスクリプトの先頭を『#!/bin/bash』にしたくないのは、自分自身の好みだからです。『/bin/bash』より『/bin/sh』の方がlinuxの環境を変えてもつぶしがききそうなイメージですから。
スクリプト内のコマンドが『/bin/sh』の範囲のコマンドで済むのでしたら、先頭を『#!/bin/bash』にしたくないんです。今回はselectというコマンドが『/bin/sh』の範囲で済まないことがわかりましたので、シェルスクリプトの先頭を『#!/bin/bash』に直します。
こんなものでよろしいでしょうか...
オフライン
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
あ、あと萎縮しないで頂けると……(汗
オフライン