سؤال

أنا أتساءل لماذا optarg إرجاع مسار غير صالح في الحالة التالية: --foo=~/.bashrc ولكن ليس إذا تركت مسافة بينهما --foo ~/.bashrc.

وما هو الحل حتى يعمل في كلتا الحالتين.

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

int main(int argc, char *argv[]) {
    int opt = 0;
    int long_index = 0;
    char *f; 
    static struct option longopt[] = { 
        {"foo", required_argument, 0,  'd' },
        {0,0,0,0}
    };  
    while ((opt = getopt_long(argc, argv,"d:", longopt, &long_index )) != -1) {
        switch (opt) {
            case 'd' : 
                printf("\n%s\n", optarg);
                f = realpath (optarg, NULL);
                if (f) printf("%s\n", f); 
                break;
            default: 
                exit(1);
        }   
    }   
    return 0;
}

انتاج:

$ ./a.out --foo=~/.bashrc
  ~/.bashrc

$ ./a.out --foo ~/.bashrc
  /home/user/.bashrc
هل كانت مفيدة؟

المحلول

يحدث ذلك لأن "توسيع التلدة" يتم تنفيذه بواسطة الصدفة:فهو ليس مسارًا صالحًا بحد ذاته.يتم توسيع التلدة ~ كدليل رئيسي فقط في حالة وجودها في بداية وسيطة سلسلة، والتي تبدو كمسار.على سبيل المثال:

$ echo ~
/home/sigi
$ echo ~/a
/home/sigi/a
$ echo ~root/a
/root/a
$ echo ~a
~a
$ echo a/~
a/~

إذا كنت تريد تقديم هذه الوظيفة في الحالة الأولى أيضًا، حيث لا تستطيع الصدفة مساعدتك، أو بشكل عام توسيعات الكلمات التي تستخدمها الصدفة، يمكنك العثور على جميع المعلومات المطلوبة للقيام بذلك بنفسك في هذا المرجع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top