2016-04-29 13 views
0

Mac OS XのC/POSIXでシェルを開発しようとしています。cdコマンドの場合、ほとんどの場合、パスに空白がある場合を除き、ほとんどシェルのディレクトリを変更できます。私は同じパスと使用を取る場合POSIX/C:chdir()ディレクトリをスペースで変更しないでください。

No such file or directory 

しかし、たとえば、そのよう

/users/bayesianStudent/desktop 

としてパスが正しくディレクトリが、以下、

/users/bayesianStudent/desktop/Spring\ 2016 

リターンエラーメッセージを変更します通常の端末では正常に動作します(パスに何も問題ありません)。以下は、問題を複製ダミープログラムです。また

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    char path[1024]; 
    char cwd[1024]; 

    printf("Please enter path:\n"); 
    gets(path); 
    printf("Trying to change the path to %s\n", path); 

    int i = chdir(path); 
    if(i == 0) 
    { 
     printf("sucess\n"); 
     if (getcwd(cwd, sizeof(cwd)) != NULL) 
      fprintf(stdout, "Current working dir: %s\n", cwd); 
     else 
      perror("getcwd() error"); 
    } 
    else 
    { 
     perror("Directory not changed: "); 
    } 
    return 0; 
} 

、私はシェルを開発しておりますので、私はlsなどのファイルパスを使用する他のコマンドと同じ問題に遭遇します。

execvp("ls", path, NULL); 
+2

パスを入力するときにスペースの前にバックスラッシュを入力していますか?もしそうなら、それをしないでください。 –

答えて

2

あなたがあなたのプログラムに入力するパス非常に具体的ではないので、私は何が起こるかを説明しよう:

たとえば、私は(そこにスペースがあるが、パスが正しいこと)のために同様のメッセージが表示されます
  1. cdのようなシェルコマンドを発行すると、シェルはコマンドラインを解釈し、エスケープされていない空白で分割します。あなたの例では、パス名をSpring2016の間で分割しないようにするため、そのスペースをエスケープします。

    つまり、シェルは/users/bayesianStudent/desktop/Spring\ 2016/users/bayesianStudent/desktop/Spring 2016に変え、それがプログラムに到着します。

  2. あなたはそれがあるとしてパスを入力する必要がありそうエスケープはありません

    printf("Please enter path:\n"); 
    gets(path); 
    

    のように、あなたが入力したプログラムへのパスをした場合。 特に、/users/bayesianStudent/desktop/Spring\ 2016と入力すると、プログラムに\を含む文字列が表示され、そのようなディレクトリが存在しないことがわかります。

関連する問題