1

シェルを書くのは初めてです。追加の引数を指定しない場合、「cd」でホームディレクトリに移動しようとしています。

しかし、「cd」を呼び出してコードを実行しようとするとchdir(getenv("HOME"))、エラー メッセージが表示されます"No such file or directory"

/*
  Builtin function implementations.
*/
int cd(char **args){
  if (args[1] == NULL){
    printf("%s\n", getenv("HOME"));
    if (chdir(getenv("HOME")) != 0) {
      perror("dsh");
    }
  } else if (chdir(args[1]) != 0){
    perror("dsh");
  }
  return 1;

}

getenv("HOME")正しいディレクトリを提供します。つまり、"/Users/oasisweng"

私は何か間違ったことをしたと思います。どこを修正すればよいですか?できれば理由を教えてください。

ここで chdir man を読みましたが、手動で入力cd /Users/oasiswengすると機能します。

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

4

1 に答える 1

0

ご協力ありがとうございます。答えを見つける際に、MCVE ガイドラインに従おうとしました。1 人が私の質問にマークを付けたので、回答を共有する必要があると感じています。

問題は、最初に設定した方法であることがわかりました$HOME

したがって、基本的に、私のシェルはファイル内$HOME$PATH変数を読み取りますprofile。次のようになります。

PATH=/bin:/usr/bin:/usr/local/bin\n
HOME=/Users/oasisweng\n

各行を=符号で分割setenvし、右側の値を左側の名前に保存します。

問題は、関数が呼び出されたときの一部としてsetenvも保存されることです!\n$HOME

cd(getenv("HOME"))実際cd("/Users/oasisweng\n")には最後に改行文字が付いています。であるはずなので失敗しますcd("/Users/oasisweng")

私の解決策は、前の右側の各値の改行文字を削除することですsetenv:

int remove_newline(char* str){
  char* rst = strchr(str,'\n');
  if (rst != NULL){
    *rst = '\0';
    //found and changed
    return 0;
  } else{
    //not found
    return 1;
  }
}

ブーム!稼働中です。

このレッスンは非常に些細なことですが、それでもなお役立つリマインダーだと思います。

于 2015-11-02T23:13:10.273 に答える