cd..がLinux端末で動作しないのはなぜですか?

cd..がLinux端末で動作しないのはなぜですか?

Windows / DOS端末でcd..ディレクトリを正しく変更してください。

Linux ターミナルで、以下を指します。CDコマンドを分離する必要があります。パーサーがこれを行う必要がある方法/理由を知りたいです。スペースを追加しないと、コマンドは理解されません。

これは非常にうまく機能します

 cd ..

これはうまくいきません

cd..

regExpまたはコマンドを解析するすべてのエントリには、コマンドの直後に可能な文字としてドットが含まれていない可能性があります。

答え1

一般的な構文は次のとおりですcd ..。 Windowsコマンドソルバーはより柔軟で、この構文も受け入れますcd..

シェルを使用するcd..ときは、正しい名前のコマンドまたはプログラムを見つけます。cd..

bashこのコマンドを許可するには、cd..エイリアスを定義するだけです。

alias cd..="cd .."

答え2

実際の違いはありません。 Windows CMD シェルはタイプミスに対応することを決定しますが、Linux シェルはコマンドやプログラム (この場合はシェルに組み込まれている CD) を引数から切り離す方が厳しくなります。

答え3

UnixとLinuxではなぜcd..機能しないのですか?

Unixシェルは英数字以外の多くの文字(たとえば)を文字として扱うため、などの@_+-{}:,./~コマンドを使用できます。だから、シェルがそれを見るとき、またはそれと変わらない4文字の単語で見るので、名前付きのコマンドを探します。1 1文字だからといって2つの単語に分けられないa@b_c+d-cd..cdefcd56cd..d.いいえ(CMD方式、以下を参照)。
______________
1  指摘したように博多、名前付きの別名(またはシェル関数(またはシェルスクリプト))を定義できますcd..。もちろん  cd.. (または)という名前のシェルスクリプトを書くのはおそらく良い考えではありません。シェルスクリプトは、それを呼び出すシェルにディレクトリを変更させることができないためです。cdanything

なぜcd..CMDで動作しますか?

CMD がコマンドを解析する方法に関するルールは、複雑でよく文書化されていないようです。

  • ウィキブック説明する:

    コマンドラインを一連のコマンドに解析するのは複雑で、さまざまなコマンドソルバー間には微妙な違いがあります。

  • デビッドデリーWindowsでは、「すべての人が異なって解析します」と言います。

    コマンドラインをShowParams.exe(C / C ++で作成)、ShowParams.vbs(VBScript)、またはShowParams.bat(バッチファイル)に渡すと、他の結果が得られます。

  • Windowsコマンドソルバー(CMD.EXE)はスクリプトをどのように解析しますか? (スタックオーバーフロー)タイトルの質問に対する広範で詳細な回答が含まれています。

...しかし(約1時間検索しましたが)CMDがこれを決定する方法を具体的に説明するものが見つかりませんでした。 コマンドは何ですか? (これをargv[0]UnixではCプログラムと呼びます。)

Windows 7でいくつかのテスト/実験を行いました。私が観察したパターンの1つは、最初のトークン化ステップ(空白と、、、、<など  >の優先順位の高い文字でコマンドラインを中断)した後、CMDがコマンドラインの最初の単語を調べてそれを他の単語に置き換えることです。です&。  |- 英数字付き,/.、、、、  +そして  =)  \

  • その言葉が届いたら最初これらの英数字以外の文字は、引数を使用せずにコマンドを実行する組み込みコマンドです。たとえば、、、、、、、、、、、、、、、、、、、、、シンプルで明確cls.な  画面  など  、  さまざま  cls..な  バリエーション  cls.abcが  あり  ます。同じ上記と。cls.a.b.ccls.execls=cls=abccls+cls+abccls\cls\abcclspause

    一見すると、以下は上記の例外のようです。

    • cls/cls/a/b/c エラーメッセージを表示します。 
    • cls/? ヘルプメッセージを送ってください。
    • pause/ 単に一時  pause/a/b/c 停止します(つまり、通常のように動作しますpause)。
    • pause/? 「続けるには任意のキーを押してください」というヘルプメッセージが表示されます。 。 「しかし、 あなたがキーを押すまで待つことはありません。  (これは間違いです。)
       

    ただし、上記は、キャラクターレベルでトークンに分類したいCMDのアイデアと一致しています  /。たとえば、cls/ と同じように動作します。cls /

  • echo 特別なケースです:
    • echo on エコをつけてください。
    • echo off エコを消してください。
    • 単にecho エコーフラグの状態を報告します。
    • しかし、ifechoの直後に英数字以外の文字が続く場合(たとえば,、 . または  /)、文字は無視されますが、コマンドの残りの部分に対する特別な処理は無効になります。したがって、「on」または「off」という単語を印刷するには、またはを使用し、echo.on 空白echo.off行を印刷するにはを使用します。だから行動は[sic]と同じです。echo.echo..echo .
  • 長い話を短く
    それ以外の場合は、CMDが尊重しているようです。最後ドット(またはドットグループ)、サブストリングが組み込みコマンドの場合は、対応する組み込みコマンドとして解釈されます。したがってcd..、、、  dir..およびすべて最初の点の前にスペースがあるかのように動作します。 type..\filename.txtcopy..\filename newname

ただし、これは組み込み機能でのみ機能し、「...内部または外部コマンド、実行可能プログラム、またはバッチファイルとして認識されません」というエラーが発生しますcalc.. 。  find..したがって、いくつかの興味深い例は次のとおりです。

  • というプログラムがある場合は、abcd.efg.exe入力して実行できますabcd.efg。しかし、と呼ばれる場合は にcd.efg.exe解析cd.efgされるので失敗しますcd .efgcd.efg.exe
  • abcd同様に、現在のディレクトリにサブディレクトリが呼び出され、efg.exeそのサブディレクトリから呼び出されるプログラムがある場合は、入力して実行できますabcd\efg。ただし、サブディレクトリが呼び出されるcdcd\efg解析されて失敗しますcd \efgcd\efg.exe

答え4

cdWindowsでは内部コマンドなので、Windowsでは実行可能ファイルとして見つかりません。

ここ内部DOSコマンドのリストです。

そしてcdLinuxシステムでは/bin

[root@localhost j]# ls /bin/cd
/bin/cd

cdFew を実行するか、またはanycommand後に来ると、argsbash は $PATH 環境変数 ( に設定できます) に入力した最初の項目を検索し、プログラムを実行し、 で入力したすべての項目を提供する/usr/binため、空白の引数だけを受け入れることができますargs。入力すると、bashはそのプログラムを見つけることができないので、正確に以下を見つけてcd..エラーを表示します。cd../usr/bin

これがより良いデザインです。

関連情報