Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: virtual files?

20.04.2016, 05:13, "Emanuel Berg" <embe8573@xxxxxxxxxxxxx>:
> "Nikolay Aleksandrovich Pavlov (ZyX)"
> <kp-pav@xxxxxxxxx> writes:
>>  In some cases you may use `>(process)` to create
>>  file descriptor that will be used like a named pipe
>>  and may replace real files in some cases (it does
>>  not support seek(), also some processes have a habit
>>  of closing all file descriptors except
>>  stdin/stdout/stderr). But it is launched in subshell
>>  which limits the usefullness further (i.e.
>>  you cannot directly save result in a variable).
> OK! That doesn't seem like any good samochuvstvie...
>>  Specifically this function does not need >() or any
>>  file at all:
>>      ... echo -n \$ wget -q $link -O- | grep answer | cut
>>  -d \$ -f2 | cut -d \< -f1 ...
> But you still need the escaped quotes around "answer"
> otherwise it won't work due to the HTML data :)
> Now, it is true you don't *need* files here or in
> other situations like this. But it is a very good
> thing to have, to be able to name something something,
> and then stash the result there for future use.
> A variable or data structure, in essence.

For `wget -Ofoo` there may not be any variable/data structure. At all, file `foo` in this example is created by *wget*, zsh *cannot* intervent here: all it knows is that `wget` received argument `-Ofoo` which is a plain string like any other argument, it does not know what `foo` is (completion system is a separate thing and it can only make *guesses*, not know for sure). If you really need this you can create something like temporary tmpfs via FUSE which will be automatically unmounted when scripts exits, and this does not require any special support on zsh side.

As the other alternative one may create something like `=()` to work like “create temporary file, substitute its name here, after process finishes save file contents in the variable and remove it”. Basically a syntactic sugar for what you currently are doing, should be relatively easy (I did not look at relevant parts of the code though). Most of time this is not really needed: you may simply use stdout or stderr. Least of time… well, this is a *shell* language, complex applications were never its target. I believe this is why better integration with subprocesses is not implemented yet, though I sometimes see problems which would be solved much easier if e.g. when opening subshell zsh created a file descriptor through which updates to variables would be directed (i.e. something like a command socket, but through a pipe).

> Obviously creating a normal file just to remove it
> last thing doesn't score you any hacker points...
> So I think this is a good idea for you to contemplate
> incorporating in zsh!
> --
> underground experts united .... http://user.it.uu.se/~embe8573
> Emacs Gnus Blogomatic ......... http://user.it.uu.se/~embe8573/blogomatic
>                    - so far: 25 Blogomatic articles -

Messages sorted by: Reverse Date, Date, Thread, Author