D получает местоположение в аргументах?

Я довольно новичок в изучении D (например... вчера, после поиска тестов Kotlin...) и в настоящее время пытаюсь решить, хочу ли я справиться с этим языком.

Я пытаюсь передать некоторые аргументы из командной строки и немного удивлен. Допустим, я прохожу "-Foo-Bar". Моя программа довольно проста:

import std.stdio;

void main(string [] args) {

    foreach(arg; args) {
        writeln(arg);
    }
}

Исходя из Java, я ожидал, что он напечатает

  • -Фу
  • -Бар

Но моя программа D, кажется, получает свое местоположение в качестве первого аргумента? Результат:

  • /home/(имя пользователя)/Java_Projects/HelloD/hellod
  • -Фу
  • -Бар

Я пытался найти это, но все хиты Google относятся к переключателю -D Java... Итак, это предполагаемое поведение? Если да, то кто-нибудь знает, почему?


person Silverclaw    schedule 13.07.2016    source источник
comment
Да, С++ (и многие другие языки) работает именно так. Первым аргументом всегда является путь к исполняемому файлу.   -  person Nil    schedule 13.07.2016
comment
Возможный дубликат Является ли args[0] гарантированным путем выполнение?   -  person Patrick Bell    schedule 13.07.2016
comment
Этот дубликат предназначен для другого языка.   -  person Silverclaw    schedule 14.07.2016


Ответы (1)


Это нормально в D, унаследованном от C и C++. Первый аргумент — это имя программы, поэтому вы можете использовать его, чтобы определить, какую функцию вы хотите использовать в многоцелевой программе.

Инструментарий busybox unix https://busybox.net/ использует это (ну, по крайней мере, привык, я не уверен, изменилось ли оно ), поэтому одна программа, busybox, может вызываться как различные команды unix, такие как ls или cp.

Используя args[0], он может сказать, как он был вызван, хотя все они указывают на одну и ту же двоичную программу и отвечают соответствующим образом.


СОВЕТ: если вас это не интересует, вы можете зациклить только свои аргументы с помощью foreach(arg; args[1 .. $]) {}

person Adam D. Ruppe    schedule 13.07.2016
comment
Спасибо. До сих пор я избегал C-подобных языков, и теперь это было нормально. И довольно сложно найти в Google что-либо, связанное с D. х__х - person Silverclaw; 13.07.2016
comment
Я могу подтвердить, что busybox все еще использует это, другой пример — mkfs, где специфичные для fs команды, такие как mkfs.ntfs, являются символическими ссылками на единственный двоичный файл mkfs. - person cym13; 13.07.2016
comment
Чтобы немного упростить работу с Google, используйте язык программирования dlang или d вместо просто D. - person Meta; 13.07.2016
comment
Я сделал, но это помогает только в очень ограниченной степени. - person Silverclaw; 14.07.2016
comment
Речь идет не только о C-подобных языках, у Python также есть имя программы в sys.argv[0]. Но поскольку Python написан на C, вы также можете назвать это «унаследованным от C». :-) - person Max Alibaev; 14.07.2016
comment
Кстати, может быть, лучше предупредить вас, что args[0] не обязательно будет полным путем к двоичному файлу. Насколько я знаю, это может быть относительный путь или путь к символической ссылке, в зависимости от того, как именно была запущена программа. - person Max Alibaev; 14.07.2016
comment
На самом деле, это редко полный путь, это первая часть команды, введенной пользователем, которая иногда является путем, но не обязательно. Программы, вызывающие другие программы, также могут помещать туда произвольные данные (и, кстати, это изменяемая строка на самом низком уровне, D копирует ее в неизменяемую, но если вы используете функции более низкого уровня, программа также может изменить эту строку - некоторые используют это означает, что команда ps показывает что-то другое, например, если вы разветвляете и хотите, чтобы демон выделялся в ps В D import core.runtime; Runtime.cArgs.argv является изменяемой версией. - person Adam D. Ruppe; 14.07.2016
comment
На самом деле, это не C, а Unix, определяемый системным вызовом exec. Языки программирования отражают только то, что предоставляет ОС. Java, так или иначе, является собственной ОС, она может переопределить модель своей машины по своему усмотрению (вероятно, для повышения переносимости). Так что лишний здесь Java, а не D. - person Patrick Schlüter; 15.07.2016
comment
@ Адам, изменчивость args также зависит от ОС. Например, в Solaris вы можете изменить содержимое args, но это изменение будет видно только тому процессу, который изменил значение. Такие инструменты ОС, как ps, prstat или top, не будут затронуты. Мутация не отражается в файловой системе /proc (в отличие от Linux). - person Patrick Schlüter; 15.07.2016