ターミナルの誤動作

ご存知の方に質問です。


ターミナルを連続動作させる方法は有りますか。


具体的には、

 ls パス1

 ls パス2

 ls パス3

 ...

とか

 rm パス1

 rm パス2

 rm パス3

 ...

とかを

数十から数百行連続させる方法です。

本来は、スクリプトの仕事なのでしょうが、

私、スクリプト音痴で、

学習の手間暇と本人の誤記を避けたいので、

確実なコマンドの羅列を使用しています。

しかし、

なぜか、

行数が多いと、ターミナルの動作が不安定?です。

単独実行可能なコマンドが、ファイルやディレクトリは無いと言い出します。

ちなみに、

ファイルからの実行ではなく、クリップボードからターミナルへ

全行を複写してます。

投稿日 2009/05/29 20:50

返信
返信: 28

2009/05/29 21:58 ken3_in への返信

ken3_in による書き込み:


ファイルからの実行ではなく、クリップボードからターミナルへ

全行を複写してます。



スペースが混じっているとか、改行の不正では?


ターミナルでは、↑キーで直前の入力コマンドが再現されますけど、その修正じゃ間に合わないんでしょうか?


PS:

>学習の手間暇と本人の誤記を避けたいので、

後者はいいですが、前者は問題ですね。

学習の手間暇を避けたければ、代わりにやってくれる人を雇うんでしょうが、ここで聞いて無料で済まそうっちゅうことですか?

2009/05/29 21:57 ken3_in への返信

ken3_in による書き込み:


ファイルからの実行ではなく、クリップボードからターミナルへ

全行を複写してます。




先行入力バッファを超えている場合、正しく実行されません。

バッファサイズが何バイトかはくわしくないので、わかりません。(^_^;)


クリップボードからコピーできる程度のものでしたら、テキストファイルに書いてやって実行するのが確実です。


手順は

  • クリップボードの内容を新規テキストファイルにペースト
  • テキストエンコーディングはUTF8、改行コードはLFに設定。
  • 好きな名前、例えば testで保存。
  • ターミナルで実行
    1. testを保存したディレクトリなら以下を実行

      bash test

    2. testを保存したディレクトリ以外なら

      bash testのpath


これでお望みの結果が得られると思います。

2009/05/29 22:26 xy への返信

き 厳しい。


> 学習の手間暇を避けたければ、代わりにやってくれる人を雇うんでしょうが、ここで聞いて無料で済まそうっちゅうことですか?

  無料には違いはないですが、

  仕事でないので、人は雇えませんし、

  そんな金はどこにもありません。

  学習の手間はかける必要がありますが、

  すぐに実行したい内容には使いたくありません。

   じっくりやってLinux音痴を解消したいです。


肝心な件ですが、

> スペースが混じっているとか、改行の不正では?

  たびたびしくじってますが、

  この件では、しっかりエスケープしてます。

   エディタ設定がシフトJISとCR/LFだからってこと?

   ま まさか

  200行超のlsを3回試して、

  3回目だけ成功したこともあります。

   シフトJISとCR/LFです。

2009/05/29 22:36 こういち への返信

> 先行入力バッファを超えている場合、正しく実行されません。

  先行入力バッファってどこで設定するのでしょうか。

  ターミナルインスペクタでは、

  バッファサイズ=10000行になってます。

> クリップボードからコピーできる程度のものでしたら、テキストファイルに書いてやって実行するのが確実です。

  やはり、

  この方が良いのですかね。

> テキストエンコーディングはUTF8、改行コードはLFに設定。

  シフトJISとCR/LFで気にせずやってました。

  これって、

  動く方がまぐれでしょうか。

2009/05/30 03:42 ken3_in への返信

ken3_in による書き込み:


> 先行入力バッファを超えている場合、正しく実行されません。

  先行入力バッファってどこで設定するのでしょうか。

  ターミナルインスペクタでは、

  バッファサイズ=10000行になってます。

それは、画面のログのバッファです。


そもそも、「先行入力バッファ」という独立したものが作られているかどうかもわかりませんが、時間がかかる処理をさせているとき(例えば数MBのテキストファイルを表示(cat)させているなど)にキーボードを打っても表示の途中にうった文字が割り込まれるのではなくて、処理後のコマンドプロンプトに表示されます。これはどこかに入力内容を覚えているためでそのためのバッファ(一時記憶場所)を意味しています。


  シフトJISとCR/LFで気にせずやってました。

  これって、

  動く方がまぐれでしょうか。


コマンドを直接ペーストをする場合、改行コードは画面上の制御コードですので意識する必要はないと思います。

2009/05/31 02:34 こういち への返信

それは、画面のログのバッファです。


そもそも、「先行入力バッファ」という独立したものが作られているかどうかもわかりませんが、時間がかかる処理をさせているとき(例えば数MBのテキストファイルを表示(cat)させているなど)にキーボードを打っても表示の途中にうった文字が割り込まれるのではなくて、処理後のコマンドプロンプトに表示されます。これはどこかに入力内容を覚えているためでそのためのバッファ(一時記憶場所)を意味しています。

使用したテキスト行は

 200行程度の行です。

 桁数は各行120程度です。

もし、

ログのバッファ程度の大きさがあれば楽勝のバイト数と思います。


現象としては、

 数十行の空ディレクトリのls後

 結果表示のLFが無視され

 一行内に2行分の結果がlsされ

 以後

 数行分プロンプト無しで空ディレクトリのlsに失敗?

 また

 正常に復帰して

 それ以降の空ディレクトリのlsを継続し終了

でした。

1回目実行

 上記の結果

2回目実行

 上記の結果

3回目実行

 正常???


何かに途中で割り込まれているような

印象です。

 裏にいるアプリケーションの数は

 Safariとテキストエディタとfinderの

 三つです。


コマンドを直接ペーストをする場合、改行コードは画面上の制御コードですので意識する必要はないと思います。

自動変換に期待しているところですが、

安全な方向性で、

張り付けの元を作るときにLinux的にしようと思います。

 MS的な影響でシフトJISとCR/LFでしたので。

2009/05/31 06:03 ken3_in への返信

張り付けの元を作るときにLinux的にしようと思います。

 MS的な影響でシフトJISとCR/LFでしたので。


ですから、数行のペーストはターミナルとしては想定されていない使い方です。

UTF8で改行はLFのテキストファイルを作りそれを前述のように実行してください。

2009/05/31 10:20 こういち への返信

ですから、数行のペーストはターミナルとしては想定されていない使い方です。

UTF8で改行はLFのテキストファイルを作りそれを前述のように実行してください。

えっ。

そういうことですか!?。


単なるコマンド羅列だったので、スクリプトファイルを作るまでもないと

思ってました。


これは目から鱗でした。

これからは、スクリプトを覚えつつファイルで処理しようと思います。


ありがとうございました。

2009/05/31 16:20 ken3_in への返信

単なるコマンド羅列だったので、スクリプトファイルを作るまでもないと

思ってました。


これは目から鱗でした。

これからは、スクリプトを覚えつつファイルで処理しようと思います。



私は初めからそう述べていますが。

しかもスクリプトを覚える必要はありません


もしかして私の一番はじめの投稿をご覧になってない?



Re: ターミナルの誤動作

2009/06/01 11:53 こういち への返信

すみません。

表現が悪かったです。


もしかして私の一番はじめの投稿をご覧になってない?



Re: ターミナルの誤動作

ファイルの処理については読んでいます。

実は、

スクリプトファイル(私の限界でコマンドの羅列です)もどきの

ファイル処理はやったことが有ったのですが、

直に貼付けてキャリッジリターン付で即実行というのが、

安直でして、そっちに流れていた結果が、

今回の投稿になりました。


そのため、

私の実行した209行のlsを直に貼付ける方法自体が、

ターミナルの想定外ということを思いもしませんでした。

ですから、数行のペーストはターミナルとしては想定されていない使い方です。

このご指摘は、私には驚きでした。


私の現状では、

単純なコマンドを各パスごとに編集して動作させ、

その結果を、

各パスごとに確認するという作業を、

テキストエディタで編集して行ってます。

 →これを直に貼ってた

この処理は、

スクリプトを書いて実現可能と思っていますので、

ゆくゆくはそうしたいと思っています。


有効なご指摘、ありがとうございました。

2009/06/01 15:37 ken3_in への返信

ken3_in による書き込み:


私の実行した209行のlsを直に貼付ける方法自体が、

ターミナルの想定外ということを思いもしませんでした。

ですから、数行のペーストはターミナルとしては想定されていない使い方です。

このご指摘は、私には驚きでした。

ターミナルと書かれてますが、これはシェルの機能です。多数行をペーストして貼付けても問題ありません。man bash とすると書いてますが、Listsのところに、Lists とはどんなものであるか述べられており(大雑把にいってしまえば、コマンドの羅列です)、その中に<newline>(one or more newlines)が入っていてもよいと書いています。one or more と書かれているので、何百入っていてもいいはずです。

なので敗因は、コマンド行をペーストしたことではないと思います。問題はコマンドの繋ぎ方と思います。コマンドをどのように繋ぐかで動作は変わります。ある繋ぎ方では前のコマンドが完了する前に次のコマンドが実行されますし、別の繋ぎ方では、前のコマンドが完了するまで次のコマンドは実行されません。ken3_in さんは、後者の動作になってほしかったのではないでしょうか。そのためには、コマンドは ";" (セミコロン)で終わっていないといけません。各コマンドの最後に ";" を入れてましたか?

シェルを勉強したくないとおっしゃってますが、少しは調べて使わないと期待通りに動作しません(期待とは違うときは調べる、でいいです)。お使いの方法はシェルスクリプトそのものですから。man bash とすると出て来ますが、shell script とは、ファイルとは限りません。"Bash is an sh-compatible command language interpreter that executes commands read from the standard input or from a file." とあります。

MacOSX では、default shell は bash なので、bash を使っておられるとして書いてます。もし、他のshell に変えておられるならそのshell のmanを調べてください。でも、shell script 的な使い方をされるのなら、bashが一番便利(かつ標準)と思いますけど。

2009/06/01 16:27 はに への返信

多数行をペーストして貼付けても問題ありません。


問題なくはないと思います。

ある繋ぎ方では前のコマンドが完了する前に次のコマンドが実行されますし、


なので、lsを連続実行すれば、lsのアウトプット中に次のコマンドの実行をされれば表示がぐちゃぐちゃになるのでアウトプットの表示を次に利用しようとしているのであればめちゃめちゃになるのは道理です。


コマンドは ";" (セミコロン)で終わっていないといけません。


セミコロンでのつなぎはちょっと試してみましたが、私のところでは50行くらいつなげたところで「Alias loop.」となって実行できなくなります。


シェルを勉強したくないとおっしゃってますが、少しは調べて使わないと期待通りに動作しません(期待とは違うときは調べる、でいいです)。


それでいいと思いますが、「生兵法はけがの元」。よくわからないのであればイレギュラーなことはしないことです。

2009/06/01 16:44 HAL への返信

HAL による書き込み:



セミコロンでのつなぎはちょっと試してみましたが、私のところでは50行くらいつなげたところで「Alias loop.」となって実行できなくなります

エラーから見ると、ls になにかAlias が設定されているのでは?

うちでは、100行程で試してみましたが何も変なことは起きません。

ペーストで入力というのは、ターミナルから見れば、standard input になるので、問題はないと思いますが。

ただ、実行に時間がかかるコマンドなどが混在しているときは、あらかじめ時間を見込んで対策しておくなどのことは必要になることもあるかもしれません。コンピュータも完全には信用できませんので。

2009/06/03 07:57 ken3_in への返信

はに様 HAL様

さらに詳しく返信ありがとうございます。


お二人の実験結果を読んで、

少し試しました。


条件は、

1.

 a.

 前回問題を起こしたDocuments以下のディレクトリ構造を使用する。

 ディレクトリ数:209

 b.

 前回問題を起こしたDocuments以下と、同一の、新規ディレクトリ構造を使用する。

 (ディレクトリ内にゴミが無いはず)

 ディレクトリ数:209

2.

 a.

 全ディレクトリに対してlsを実行する。

 (日本語と空白と"("と")"が混在する)

 ls行数:209

 b.

 アスキー文字列のディレクトリに対してlsを実行する。

 (空白と"("と")"が混在する)

 ls行数:143×2

 (全体を2回実行)

3.

 a.

 標準入力(コンソール)から貼り付けを使用する。

 b.

 ファイルから入力を使用する。

 (3.a.条件の元ファイル)


結果は、

条件3.の入力条件での差は有っても

条件1.2.には差は有りません。

 条件3.a.の張り付けでは、

  100%誤動作します。

  (ルートディレクトリまでもが見えた)

  正常動作に混じって、

   lsの行が他のls行に割り込まれたり

   ls行が不完全で"No such file or directory"となる。

 条件3.b.のスクリプト実行(?)では、

  100%正常動作します。

  (変な表現ですが...)


なお、

比較として、

実行ユーザーを変更して、

常駐物を減らしても試しました。

管理用アカウントだと常駐物が少ないので、

psで見つつ、非OSXのアプリケーション由来の物をkillしてみました。

ただし、ステータスはSで影響無さそうでしたが...。

この場合は、

条件1.b.は省略です。

(先にやってしまった)

結果は、

 何も変化無し、同一です。


私の場合、

非標準の環境は有り得ませんので、

bashもlsもそのままです。

なぜ、

直接貼付けると誤動作するのか不思議です。


すみません、

書き忘れてました。

コマンドのデリミターですが、

";"を付けてもだめでした。

条件は、1.a.2.a.3.aに相当しますが、

真っ先にやってしまって、効果が無かったもので、

上記の試しでは付けてません。

ちなみに、

ちらっと試したstty -echoもだめでした。

このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

ターミナルの誤動作

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。