مسار ملف غير صالح باستخدام getopt_long في C
-
26-12-2019 - |
سؤال
أنا أتساءل لماذا 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/~
إذا كنت تريد تقديم هذه الوظيفة في الحالة الأولى أيضًا، حيث لا تستطيع الصدفة مساعدتك، أو بشكل عام توسيعات الكلمات التي تستخدمها الصدفة، يمكنك العثور على جميع المعلومات المطلوبة للقيام بذلك بنفسك في هذا المرجع.
لا تنتمي إلى StackOverflow