Thread overview |
---|
March 01, 2019 Executing a D script without an [extension in the filename] leads to an error | ||||
---|---|---|---|---|
| ||||
I've installed D compiler, and when i try to run a D script with filename without an extension/file type named: program via: ./program I'm getting and error: vaidas@SATELLITE-L855:~/Desktop$ ./program Error: module `program` is in file './program.d' which cannot be read import path[0] = . import path[1] = /snap/dmd/49/bin/../import/druntime import path[2] = /snap/dmd/49/bin/../import/phobos Failed: ["/snap/dmd/49/bin/dmd", "-v", "-o-", "./program.d", "-I."] Now, when I rename my scirpt file : program To: program.d and execute it by: ./program.d I no longer have an error. Is this an intended behaviour? |
March 01, 2019 Re: Executing a D script without an [extension in the filename] leads to an error | ||||
---|---|---|---|---|
| ||||
Posted in reply to BoQsc | On Friday, 1 March 2019 at 09:00:43 UTC, BoQsc wrote:
> I've installed D compiler, and when i try to run a D script with filename without an extension/file type named: program
>
> via: ./program
>
> I'm getting and error:
>
> vaidas@SATELLITE-L855:~/Desktop$ ./program
> Error: module `program` is in file './program.d' which cannot be read
> import path[0] = .
> import path[1] = /snap/dmd/49/bin/../import/druntime
> import path[2] = /snap/dmd/49/bin/../import/phobos
> Failed: ["/snap/dmd/49/bin/dmd", "-v", "-o-", "./program.d", "-I."]
>
>
> Now, when I rename my scirpt file : program
> To: program.d
>
> and execute it by: ./program.d
>
> I no longer have an error.
>
> Is this an intended behaviour?
In such questions it's important to show your shebang since that's what runs your script.
Given your symptoms I guess you're using the following:
#!/bin/env rdmd
And indeed rdmd won't call your script if it doesn't have the proper extension.
Try using this instead:
#!/bin/dmd -run
|
March 01, 2019 Re: Executing a D script without an [extension in the filename] leads to an error | ||||
---|---|---|---|---|
| ||||
Posted in reply to Cym13 | On Friday, 1 March 2019 at 09:27:33 UTC, Cym13 wrote: > On Friday, 1 March 2019 at 09:00:43 UTC, BoQsc wrote: >> I've installed D compiler, and when i try to run a D script with filename without an extension/file type named: program >> >> via: ./program >> >> I'm getting and error: >> >> vaidas@SATELLITE-L855:~/Desktop$ ./program >> Error: module `program` is in file './program.d' which cannot be read >> import path[0] = . >> import path[1] = /snap/dmd/49/bin/../import/druntime >> import path[2] = /snap/dmd/49/bin/../import/phobos >> Failed: ["/snap/dmd/49/bin/dmd", "-v", "-o-", "./program.d", "-I."] >> >> >> Now, when I rename my scirpt file : program >> To: program.d >> >> and execute it by: ./program.d >> >> I no longer have an error. >> >> Is this an intended behaviour? > > In such questions it's important to show your shebang since that's what runs your script. > > Given your symptoms I guess you're using the following: > > #!/bin/env rdmd > > And indeed rdmd won't call your script if it doesn't have the proper extension. > > Try using this instead: > > #!/bin/dmd -run The shebang I used: #!/usr/bin/env rdmd I was visiting Dlang Tour and that's where I've got an example of shebang usage, directly from there: https://tour.dlang.org/tour/en/welcome/run-d-program-locally#/on-the-fly-compilation-with-rdmd The shebang you suggested actually works perfectly: #!/bin/dmd -run "And indeed rdmd won't call your script if it doesn't have the proper extension." Then why does Dlang Tour includes shebang: #!/usr/bin/env rdmd Instead of the one you mentioned, that is fool proof. (#!/bin/dmd -run) Is that an error/mistake in Dlang Tour guide? |
March 01, 2019 Re: Executing a D script without an [extension in the filename] leads to an error | ||||
---|---|---|---|---|
| ||||
Posted in reply to BoQsc | On Friday, 1 March 2019 at 11:38:51 UTC, BoQsc wrote:
> "And indeed rdmd won't call your script if it doesn't have the proper extension."
>
> Then why does Dlang Tour includes shebang: #!/usr/bin/env rdmd
>
> Instead of the one you mentioned, that is fool proof. (#!/bin/dmd -run)
>
> Is that an error/mistake in Dlang Tour guide?
You may want to change that too:
#!/bin/dmd -i -run
DMD doesn't automatically compile imported files (at least not until -i came along), rdmd existed to solve that problem... I don't know what value it brings with the -i switch existing.
|
March 01, 2019 Re: Executing a D script without an [extension in the filename] leads to an error | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jesse Phillips | On Friday, 1 March 2019 at 14:50:45 UTC, Jesse Phillips wrote:
> I don't know what value it brings with the -i switch existing.
Almost none, except that it's twice as slow as DMD because it needs to run DMD twice to learn about all the dependencies.
It's only useful for a few small things now:
- '-e': evaluate d code with all modules automatically imported (though now that there's std.experimental.all this value is gone too)
- makefile deps generation
- shebang line (as arguments can't be part of the shebang line)
(The list is not complete)
|
March 01, 2019 Re: Executing a D script without an [extension in the filename] leads to an error | ||||
---|---|---|---|---|
| ||||
Posted in reply to Seb | On Friday, 1 March 2019 at 16:45:38 UTC, Seb wrote:
> On Friday, 1 March 2019 at 14:50:45 UTC, Jesse Phillips wrote:
>> I don't know what value it brings with the -i switch existing.
>
> Almost none, except that it's twice as slow as DMD because it needs to run DMD twice to learn about all the dependencies.
>
> It's only useful for a few small things now:
>
> - '-e': evaluate d code with all modules automatically imported (though now that there's std.experimental.all this value is gone too)
> - makefile deps generation
> - shebang line (as arguments can't be part of the shebang line)
>
> (The list is not complete)
I forgot one big reason why rdmd is still nice: caching. It does save the generated dependency file list and checks all modification time stamps, s.t. if nothing has changed, it'll run a cached build
|
March 01, 2019 Re: Executing a D script without an [extension in the filename] leads to an error | ||||
---|---|---|---|---|
| ||||
Posted in reply to BoQsc | On Friday, 1 March 2019 at 11:38:51 UTC, BoQsc wrote:
> On Friday, 1 March 2019 at 09:27:33 UTC, Cym13 wrote:
>> On Friday, 1 March 2019 at 09:00:43 UTC, BoQsc wrote:
>>> [...]
>>
>> In such questions it's important to show your shebang since that's what runs your script.
>>
>> Given your symptoms I guess you're using the following:
>>
>> #!/bin/env rdmd
>>
>> And indeed rdmd won't call your script if it doesn't have the proper extension.
>>
>> Try using this instead:
>>
>> #!/bin/dmd -run
>
> The shebang I used: #!/usr/bin/env rdmd
>
> I was visiting Dlang Tour and that's where I've got an example of shebang usage, directly from there:
> https://tour.dlang.org/tour/en/welcome/run-d-program-locally#/on-the-fly-compilation-with-rdmd
>
> The shebang you suggested actually works perfectly:
> #!/bin/dmd -run
>
>
> "And indeed rdmd won't call your script if it doesn't have the proper extension."
>
> Then why does Dlang Tour includes shebang: #!/usr/bin/env rdmd
>
> Instead of the one you mentioned, that is fool proof. (#!/bin/dmd -run)
>
> Is that an error/mistake in Dlang Tour guide?
Well, because it isn't fool proof either ;-)
It won't work once you start using more files as you would then need the -i flag , but unfortunately most systems don't support more than one shebang argument.
I think it's simply a missing feature of rdmd to accept files without an extension as D programs (though of course the tour could be improved to be more explanatory here too).
|
March 01, 2019 Re: Executing a D script without an [extension in the filename] leads to an error | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jesse Phillips | On Friday, 1 March 2019 at 14:50:45 UTC, Jesse Phillips wrote:
> On Friday, 1 March 2019 at 11:38:51 UTC, BoQsc wrote:
>> "And indeed rdmd won't call your script if it doesn't have the proper extension."
>>
>> Then why does Dlang Tour includes shebang: #!/usr/bin/env rdmd
>>
>> Instead of the one you mentioned, that is fool proof. (#!/bin/dmd -run)
>>
>> Is that an error/mistake in Dlang Tour guide?
>
> You may want to change that too:
>
> #!/bin/dmd -i -run
>
> DMD doesn't automatically compile imported files (at least not until -i came along), rdmd existed to solve that problem... I don't know what value it brings with the -i switch existing.
All systems I know only accept one argument in shebang so sadly it's not that simple :)
|
March 01, 2019 Re: Executing a D script without an [extension in the filename] leads to an error | ||||
---|---|---|---|---|
| ||||
Posted in reply to BoQsc | On Friday, 1 March 2019 at 11:38:51 UTC, BoQsc wrote:
> On Friday, 1 March 2019 at 09:27:33 UTC, Cym13 wrote:
>> On Friday, 1 March 2019 at 09:00:43 UTC, BoQsc wrote:
>>> I've installed D compiler, and when i try to run a D script with filename without an extension/file type named: program
>>>
>>> via: ./program
>>>
>>> I'm getting and error:
>>>
>>> vaidas@SATELLITE-L855:~/Desktop$ ./program
>>> Error: module `program` is in file './program.d' which cannot be read
>>> import path[0] = .
>>> import path[1] = /snap/dmd/49/bin/../import/druntime
>>> import path[2] = /snap/dmd/49/bin/../import/phobos
>>> Failed: ["/snap/dmd/49/bin/dmd", "-v", "-o-", "./program.d", "-I."]
>>>
>>>
>>> Now, when I rename my scirpt file : program
>>> To: program.d
>>>
>>> and execute it by: ./program.d
>>>
>>> I no longer have an error.
>>>
>>> Is this an intended behaviour?
>>
>> In such questions it's important to show your shebang since that's what runs your script.
>>
>> Given your symptoms I guess you're using the following:
>>
>> #!/bin/env rdmd
>>
>> And indeed rdmd won't call your script if it doesn't have the proper extension.
>>
>> Try using this instead:
>>
>> #!/bin/dmd -run
>
> The shebang I used: #!/usr/bin/env rdmd
>
> I was visiting Dlang Tour and that's where I've got an example of shebang usage, directly from there:
> https://tour.dlang.org/tour/en/welcome/run-d-program-locally#/on-the-fly-compilation-with-rdmd
>
> The shebang you suggested actually works perfectly:
> #!/bin/dmd -run
>
>
> "And indeed rdmd won't call your script if it doesn't have the proper extension."
>
> Then why does Dlang Tour includes shebang: #!/usr/bin/env rdmd
>
> Instead of the one you mentioned, that is fool proof. (#!/bin/dmd -run)
>
> Is that an error/mistake in Dlang Tour guide?
Frankly using rdmd is closer to being fool-proof, you just haven't hit the corner cases yet :)
I'd either get used to having scripts with a .d extension or make an alias or a quick wrapper in shell and call it "program":
#!/bin/sh
exec rdmd /path/to/program.d "$@"
It's not exactly a mistake, it's just not that important to most people I guess. And as your program grows you're likely to take the habit to compile it and work with the binary directly anyway.
|
Copyright © 1999-2021 by the D Language Foundation