
Ubuntu日本語フォーラム

ログインしていません。
お世話になってます。
Windowsでは*.batを「開く」とdos窓が開いて連続でdosのコマンドを実行できますが、Ubuntuで同じようにするには、どうしたらよいのでしょう?
シェルスクリプトというのはなんとなく耳にするのですが
editerで
#!/bin/bash
コマンド
と書いてchmod u+x でパーミッションを変えても右クリックで開くを選ぶと「端末で実行」「表示する」「キャンセル」「実行」と聞かれます。
逆に#!/bin/bash と宣言しなくても .sh をファイル名につけると右クリックでプロパティーを見ると「シェルスクリプト」になります。(もちろんパーミッション変更するかプロパティで「実行可能」の欄にチェックを入れないと実行はできませんが)
また、拡張子に .sh をつけず、さらには #!/bin/bash を先頭行につけなくてもパーミッションを変えればプロパティーは実行可能になります。
つまり
平文テキストであればパーミッションさえ変えれば、拡張子に関係なく、かつ #!/bin/bash の有無に関係なく実行可能。しかし「端末で実行」「表示する」「キャンセル」「実行」と聞かれ、アクション一発では実行できない。
のでしょうか?
それともパーミッションの付け方や#!/bin/bashが間違いで、一度のアクションでコマンドを走らすことが可能なのでしょうか?
今のところ、さしせまった必要はなく、素朴な疑問なのですが、、、、
PS ファイルを右クリックでプロパティーの「実行可能」にチェックを入れるのは、どのコマンドに該当するのでしょう? chmodだとすればオプシォンは、どれに該当するのでしょう?
linuxとUbuntu独自のものが頭の中でごちゃごちゃになってるのかも(汗
オフライン
一度にたくさんの質問をされると、答えるのに大変です。
それも どこまで記述したらよいか 分かりかねます。
取り敢えず、
連続でdosのコマンドを実行できますが、Ubuntuで同じようにするには、どうしたらよいのでしょう?
Ubuntu固有ではなく、Linuxでのシャルスクリプトです。おなじシェルでも、概ねLinux系、FreeBSDとSolarisで分かれます。
シェルスクリプトにより、最小は1行のコマンドから連続実行するコマンドを作成できます。
詳細は、こちらに参考文献を載せときましたので、図書館でも行って閲覧してください。https://forums.ubuntulinux.jp/viewtopic … 657#p36657
最初に書く、#!/bin/shの意味は、簡単に述べると、シェルの実行時にシステム内部で/bin/shが実行されます。
これは、次に書くコマンドを1行づつ実行して行くことを意味します。
また、#!/bin/shの部分を、例えば#!/usr/bin/perlのように、sh以外のperlやawkスクリプトもありえます。
chmodだとすればオプシォンは、どれに該当するのでしょう?
Gnome端末で、コマンドを実行します。
~$ chmod --help
note: これで このコマンドの説明が表示されます。
確かにファイル属性のうち、パーミッションの変更を行うコマンドです。
説明していると、長文になりますので、ハーミッションとしては、r,W,X,- があります。
普通のLinuxの入門書に記載されていますので、勉強してください。
ただし、読んでみたが、この部分が よく理解できないと 申し出ていただければ、
喜んで だれかが助けてくれると 思います。
オフライン
koisan1949さん
ありがとうございます。参考にさせていただきます。
オフライン
koisan1949さんの解説のとおり
スクリプトファイル名を端末から入れると、連続で、その後のコマンドが実行される
しかし、スクリプトファイルをWクリック(または右クリックで「開く」を選ぶ)だけでは自動で端末が開いての実行はできない
という事なのでしょうか?
オフライン
スクリプトファイルをWクリック(または右クリックで「開く」を選ぶ)だけでは自動で端末が開いての実行はできない
これは、Windowsは個人で使用するので、そのまま実行できると便利なので、そのような仕様になっているのだと思います。
しかしながら、Ubuntuを含むLinuxなどのUnix系OSは、複数ユーザーで使用するのが前提となっています。
だから、かってに他人に不注意で実行されたら、大変なコマンドもあります。
また中身が不明のシェルプログラムなど、安易に考えて実行したら、他の人に多大な迷惑をかけることになりかねません。
だから、一発では実行できない様に、安全策がされていると、私は思っています。
取り敢えず、中身を見て、問題ないかどうかを確認してから、実行しなさいとの暗黙の了解事項だと解釈しています。
これが仕様だと思いますが。。。
それに、普通はファイルプラウザから、コマンドとか、シェルを実行するのは邪道です。端末から行うものと理解しています。
オフライン
koisan1949 による投稿:
しかしながら、Ubuntuを含むLinuxなどのUnix系OSは、複数ユーザーで使用するのが前提となっています。
かってに他人に不注意で実行されたら、大変なコマンドもあります。
だから、一発では実行できない様に、安全策がされていると、私は思っています。これが仕様だと思いますが。。。
なるほど~ やはりUnix系の原則は崩れないのですね。
ファイルを右クリックしプロパティーの「実行可能」にチェックを入れる操作がchmodのどのオプシォンに該当するかは操作前と操作後の変化を比べて自己解決しそうです。
ありがとうございます。
オフライン
追記 それから、シェルスクリプトを Windowsのbat_fileと同一視してはいけません。
バッチファイルは、簡単なので数時間程度で理解可能でしょうが、シェルスクリプトはそれ自体が
ものすごいプログラム言語に匹敵します。1ヶ月ほど勉強したくらいでは、入門者の域をでません。
シェルを自在に操れれば、ほとんどの操作が自動でできるようになります。それも複雑なことができます。
私は挫折しましたので、詳しくは語りません。
オフライン
#1のHideki999さんへ
Hideki999 による投稿:
Windowsでは*.batを「開く」とdos窓が開いて連続でdosのコマンドを実行できますが、Ubuntuで同じようにするには、どうしたらよいのでしょう?
実現可能かどうかという話ならば、
ファイルブラウザ(GNOMEのNautilus)にて、編集->設定->動作->[実行可能なテキスト・ファイル]->[クリックしたら実行する]を選択。
で実現できますよ。
STGSAGWANさん、ありがとうございます。
STGSAGWAN による投稿:
Hideki999 による投稿:
Windowsでは*.batを「開く」とdos窓が開いて連続でdosのコマンドを実行できますが、Ubuntuで同じようにするには、どうしたらよいのでしょう?
実現可能かどうかという話ならば、
ファイルブラウザ(GNOMEのNautilus)にて、編集->設定->動作->[実行可能なテキスト・ファイル]->[クリックしたら実行する]を選択。
で実現できますよ。
その操作で ( 「端末で実行」「表示する」「キャンセル」「実行」 )の問い合わせは出なくなりますが、
「実行」と同じ動作になり、「端末で実行」にはなりませんでした。
拡張子とプログラムの関連付けでgnome-terminalを選んだり、ダメ元でスクリプトの先頭に#!/usr/bin/gnome-terminal と記述してもダメでした。
プロパティーシートの「プログラムとして実行できる」はCUIコマンドとして実行できるのとは意味が違う気がしてます。
「端末で実行」が一度のアクションでできればイイのですが、、、
ありがとうございました。
オフライン
やはり、
スクリプトファイルをWクリック(または右クリックで「開く」を選ぶ)だけでは自動で端末が開いての実行はできない
との事なのでしょうか?
それともスクリプトファイルの置き場所が悪いとか、、、、他に方法があるんでしょうか?
オフライン
ふと、もう1つファイル(シェルスクリプト)を作成して利用することもできるなら、以下のように構成することで、可能かもしれません。
今。
実行したいスクリプトAがある。
実行したいスクリプトAを、実行しようとしている。
案。
実行したいスクリプトAがある。
実行したいスクリプトAを、実行するオプションを指定したgnome-terminalを実行するスクリプトBを作成する。
スクリプトBを、クリックで実行できるようにする。
もともと実行したかったシェルスクリプトを、hoge.shと仮定。
以下をfoobar.shとして作成して、+xして(パーミッションの実行可能をつけて)デスクトップにおいておく。
#!/bin/bash gnome-terminal --command=hoge.sh & exit 0
※詳しくは、gnome-terminalのman参照。他、titleやgeometoryも指定すると便利そうです。
起動は、STGAGWANさんの方法で、確認ダイアログが出ずに「実行」が行われる状態にしたうえで、footbar.shをクリック(ダブルクリック?)。
なお、Unix(Linux、Ubuntuも含めて)では、ファイル名の拡張子の分部の意味は、人間が見分けやすくする・・・以上の意味はあまりありません。実行可能かどうか(実行ファイルとして、実行を試みるかどうか)は、パーミッションの実行可能かどうかで決まります。それが、スクリプトなのかバイナリの実行ファイルなのかは、ファイルの内容によって判断されます(「#!」で始まっているなら、そこに書かれているコマンドで処理するべきスクリプトファイルとして、そのコマンドが起動されファイルが引き渡されます)
# 私の場合、シェルスクリプトは、.shとつけることが多いです(bashでもshでも。)
この辺の動作について、ファイルの置き場書や、ファイル名(拡張子)などによる差は無い・・・・はずです(セキュリティ関連によるものを除く)
この方法が良い方法なのか、それともじつはどこかの設定で可能なのかどうかは、判りません。識者のコメントを待ってみてください。
# シェルスクリプトや、シェルスクリプトから利用を想定しているコマンド群をつかえば、結構なんでもできちゃうので、元々ある機能を(あるのに気がつかずに)作ってしまうということが、間々あります・・・。
蛇足。
ファイル先頭の、「#!/bin/bash」に指定可能な形でうまくシェル(やPythonなど)でラッパーとなる作ることで、同じような動作をある程度汎用的に行えるものが作れるかもしれません(覚えていたら後で考えて見ます)。もし、これが可能な場合、利用する上で問題なのは、これを有効に利用する為には、全体の設定で自動的に実行してしまうオプションを選択しておかなければならないことです。
オフライン
Hideki999 による投稿:
スクリプトファイルをWクリック(または右クリックで「開く」を選ぶ)だけでは自動で端末が開いての実行はできないに
との事なのでしょうか?
についてはわからないのですが(私も知りたい)、回避策の一例として
「自動で端末を開いてその中でコマンドを実行する事」まで含めてスクリプトに書く方法があります。
多くの端末プログラムが -e など、その後にコマンド列を渡すと開いた端末内でコマンドを実行する
オプションを持っているので、例えば自動で端末を開いて3秒待つなら
xterm -e "sleep 3"
や
gnome-terminal -e "sleep 3"
など端末アプリ名を決め打ちしたり、一般的に(少なくともUbuntuは) x-terminal-emulator という名前でシステム標準の
端末アプリを指せるように初期設定されるため
x-terminal-emulator -e "sleep 3"
とする事もできます。
スクリプトファイルを作るのでしたら、コマンドラインと違いEnter入力直後にその場で実行されてしまうわけでもないので
複数行に渡る事も出来ます。もちろん「;」や「&&」でコマンドを続けて書く事も可能です。例えば
#!/bin/sh xterm -e " date df -h sleep 3 echo Goodbye; sleep 1 "
と書いて名前をつけて保存し、実行属性を与えておけば、3秒間日付とディスク使用状況を表示して、その後1秒Goodbyeと表示し端末が閉じます。
・・・ただし、上記は端末アプリに xterm を使いましたが、同じように出来そうな gnome-terminal (また、通常 gnome-terminal を指している x-terminal-emulator) は
何か使い方が悪いのか複数のコマンドを書くとうまく動きませんでした(gnome-terminal -e "echo OK; sleep 3" とかうまく行かない)。
xterm は 文字がアンチエイリアスされず見た目が気に入らない等の理由で gnome-terminal を使うなら、
逃げ道として、コマンドを解釈するシェル自身(sh とか bash とか)にも、文字列を実行するオプションがあるので(例えば sh なら -c)
「『~~~のコマンド列を実行するsh』を実行する」という形として
#!/bin/sh x-terminal-emulator -e 'sh -c " date df -h sleep 3 echo Goodbye; sleep 1 " '
などとしてやると動きます。
# いずれにせよ、何だか回りくどい感じはしますが。
オフライン
参考までに、私は以前
編集->設定->動作->[実行可能なテキスト・ファイル]->[クリックしたら実行する]
の設定をせずにダブルクリックでスクリプトを実行出来ないものかここで質問した事があり、
https://forums.ubuntulinux.jp/viewtopic.php?id=5031
スクリプトを実行ファイル形式にコンパイルする shc というツールを教えて頂いて知りました。
その時は配布元サイトからダウンロードしたものを使いました。また8.10までは
http://packages.ubuntu.com/ja/intrepid/shc
としてリポジトリにも存在していたようです。
# この8.10用のものも9.10にインストールして使うことが出来ましたが様々な理由で
# 積極的におすすめはしません。
自動的に端末を開くよう書いたスクリプトファイルを shc で実行ファイルに変換したものを
使えば、LiveCDから起動したばかりのような初期状態の環境のUbuntuでもダブルクリックで
実行できますが、実行ファイル形式にコンパイル=アーキテクチャ依存 となるわけで
x86 PCで作ったものは例えばNetWalkerのような別アーキテクチャのマシンでは動作しませんし、
中身を手軽に確認、編集できなくなるので、もうスクリプトという範疇ではない感じではあります。
オフライン
ackさん weykさん
ありがとうございます。今、帰宅したばかりなので、これから試してみます。
お二方の方法は同じですよね?なんか行けそうです。
actさんのツールは使うとしたら自己責任でやりますので、ご安心ください。
やはり同じような疑問を持たれてたんですね。
オフライン
weykさん、お世話になってます。まずはweykさんの方法をやってみました。
weyk による投稿:
今。
実行したいスクリプトAがある。
実行したいスクリプトAを、実行しようとしている。
案。
実行したいスクリプトAがある。
実行したいスクリプトAを、実行するオプションを指定したgnome-terminalを実行するスクリプトBを作成する。
スクリプトBを、クリックで実行できるようにする。
起動は、STGAGWANさんの方法で、確認ダイアログが出ずに「実行」が行われる状態にしたうえで
結果
スクリプトBをクリック(ダブルクリック?)で一発でコマンド実行できました!
weyk による投稿:
[なお、Unix(Linux、Ubuntuも含めて)では、ファイル名の拡張子の分部の意味は、人間が見分けやすくする・・・以上の意味はあまりありません。実行可能かどうか(実行ファイルとして、実行を試みるかどうか)は、パーミッションの実行可能かどうかで決まります。それが、スクリプトなのかバイナリの実行ファイルなのかは、ファイルの内容によって判断されます
この辺の動作について、ファイルの置き場書や、ファイル名(拡張子)などによる差は無い・・・・はずです(セキュリティ関連によるものを除く)
はい、確かに、今回もパーミッション変更と#!/bin/bashをつける事で、拡張子なしでterminalが開いて実行できました。
GUIになれたユーザーのためにプロパティーシートで拡張子とアプリの関連付けが可能になってるだけ
という事ですよね?
ちなみに、スクリプトBによびだされるスクリプトAにも実行可能属性をつける
スクリプトAはBの中にフルパスで指定
ですよね?。実際そうしないとダメでした
gnome-terminalと同じ/usr/bin にAを置いたらパス指定不要なんでしょうか?フォルダーのパーミッションの関係か置けなかったのですが。
actさんのxtermはちと難しそうですね(汗 ぱっと見は似たような感じに思ったのですがxtermを使った事がないからかもです(汗
オフライン
Hideki999 による投稿:
gnome-terminalと同じ/usr/bin にAを置いたらパス指定不要なんでしょうか?フォルダーのパーミッションの関係か置けなかったのですが。
actさんのxtermはちと難しそうですね(汗 ぱっと見は似たような感じに思ったのですがxtermを使った事がないからかもです(汗
/usr/bin/ に置くべきではありません。
自作のシェルスクリプトなどは、ホームディレクトリ以下にbinディレクトリを作ってそこに置くか、/usr/local/bin/以下に配置します。
また、セキュリティの問題からフルパスで指定することが望ましいです。面倒くさい場合はaliasすればよいでしょう。
オフライン
Hideki999 による投稿:
ぱっと見は似たような感じに思ったのですが
はい、実質ほとんど変わりません。
スクリプトファイルが1つで済むように、weyk さんの方法で言うhoge.sh &の部分に
直接コマンドの羅列を書いているような感じです。
オフライン
今まで実験してて、たまたま気づいたのでactさんへのお返事が先になりますが
-----------
#!/bin/sh
xterm -e "
コマンド1
コマンド2
コマンド3
コマンド4
"
------------
これでアッサリできてしまいました。
ありがとうございます。
yamaさんへのレス遅れてますが申し訳ありません。
他のLinux初心者も見てると思いますので、気づいたこと含めて後ほど、、、明日ごろにでも
オフライン
※規約違反により追放されたユーザの投稿は、ログインユーザにのみ表示されます。
オフライン
※規約違反により追放されたユーザの投稿は、ログインユーザにのみ表示されます。
オフライン
yamaさん、こんにちは。
yama による投稿:
/usr/bin/ に置くべきではありません。
自作のシェルスクリプトなどは、ホームディレクトリ以下にbinディレクトリを作ってそこに置くか、/usr/local/bin/以下に配置します。
また、セキュリティの問題からフルパスで指定することが望ましいです。面倒くさい場合はaliasすればよいでしょう。
なるほど~。そういう原則なんですね。ありがとうございます。
ポリシーは別として、純粋な技術論の場合
ターミナルでスクリプトを実行する場合、パス指定不要なのは、どういう場合なのか気になります。
--------------------
kiyoshiさん、お久しぶりです。いろいろお勉強になります。
--------------------
今回わかった事
Ubuntuしかしりませんが、Ubuntuの場合
デスクトップで平文テキストをgeditで書き、実行可能属性をつけると[端末で開く]ではなく[実行]で/usr/bin配下のGUIベースのプログラムを実行できる。
例) たった一行 firefoxでfirefox起動
gnome-terminalも/usr/bin配下なので同様
その際、「#!/bin/sh」や「#!/bin/bash」を一行目に書く必要はない。
しかし、端末内で打つべきコマンドは、必ずしも[実行]では実行されず上記の工夫が必要。
ゆえに、STGSAGWANの方法+weykさんやackさんの提示された工夫を合わせる事で
スクリプトファイルを「開く」と自動で端末が開いて連続でコマンドを実行できる
と言ったところでしょうか
ただし、ちと危険は感じます。
平文テキストに実行属性つけるとコマンドがぐちゃぐちゃでも実行可能になりますので
探究心でroot boot にあるファイルをうっかり[端末で実行]してしまうとシステムを壊すかも知れない
ので気をつけて使いたいと思います。
-----------------------------------
PS
ackさんのツールは後ほど試して見ます。
オフライン
PS
CUIコマンドを .shで保存し.shにgnome-terminalを関連付けで行ける
と考えたのが落とし穴でした。
gnome-terminalが起動するだけです(苦笑)
オフライン
Hideki999さん による投稿:
ターミナルでスクリプトを実行する場合、パス指定不要なのは、どういう場合なのか気になります。
適当なターミナルで、
$ echo $PATH
で表示される(区切り文字は":")のディレクトリ下にあるものはパス指定をしなくても実行できます。また、カレントディレクトリにある実行ファイルはWindowsとは違いそのファイル名だけの指定では実行できず、"./command-name"などとすることにより実行できます。(別にフルパス指定でもいいですが)。
あとDOS→Linuxだったら、From DOS/Windows to Linux HOWTOが役に立つと思います。ただ古いし、ディストリビューション間の差というのもあるので、すべてがUbuntuにもあてはまるかどうか分かりません。しかしシェルについての解説部分やコマンドは変っていないと思います。
オフライン
nimu による投稿:
Hideki999さん による投稿:
ターミナルでスクリプトを実行する場合、パス指定不要なのは、どういう場合なのか気になります。
適当なターミナルで、
コード:
$ echo $PATHで表示される(区切り文字は":")のディレクトリ下にあるものはパス指定をしなくても実行できます。また、カレントディレクトリにある実行ファイルはWindowsとは違いそのファイル名だけの指定では実行できず、"./command-name"などとすることにより実行できます。(別にフルパス指定でもいいですが)。
あとDOS→Linuxだったら、From DOS/Windows to Linux HOWTOが役に立つと思います。ただ古いし、ディストリビューション間の差というのもあるので、すべてがUbuntuにもあてはまるかどうか分かりません。しかしシェルについての解説部分やコマンドは変っていないと思います。
nimuさんありがとうございます。リンク先、非常に役立ちそうです。
なるほど、カレントでも./が必要なのですね。どおりで私の方法ではうまくいかないハズです(苦笑)
ありがとうございました。
オフライン