help / color / mirror / code / Atom feed
* Setting GLOB_DOTS for a single command
@ 2021-11-21  4:46 Zach Riggle
  2021-11-21  5:11 ` FW: " agkozak
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Zach Riggle @ 2021-11-21  4:46 UTC (permalink / raw)
  To: Zsh Users

[-- Attachment #1: Type: text/plain, Size: 2910 bytes --]

Hello all!

I recently learned about GLOB_DOTS, which is pretty useful in some
scenarios, e.g.

echo *(md-1)

To show all files modified within the last day.  However, in some cases I
want to see hidden files (e.g. ./.foo) as well.  The globdots option is
excellent for this!

Is there an easy way to set this for a single expression?

I know I can use a function / anonymous function combined
with LOCAL_OPTIONS to get this, but I wondered if there's something more

    show() {
        setopt | grep glob

    echo ----- Before -----

        setopt globdots
        echo ----- Inside -----
        setopt localoptions

    echo ----- After -----

I expect that there's something I can do for scripts that I fully control,
to declare some function ('globdots') which is invoked with noglob, and can
then internally set the flag, and then trigger expansion of each argument
in "$@".

    globdots() {
        setopt globdots
        local arguments=( $@ ) # TODO: Force filename expansion on each
item in ${@} or ${arguments[@]}
        setopt localoptions

    touch .hidden_file

    # Does NOT show .hidden_file
    ls -1d *(md-1)

    # DOES show .hidden_file
    noglob globdots ls -1d *(md-1)

However, I'm not sure what portion of Section 14 (Expansion) to read to
figure out how that works.  It initially looked like the (e) flag (per would do this, but it doesn't appear to.

I can just invoke "eval" on something that I KNOW will be a glob expression
to get it to expand, but blindly calling eval will execute things that are
NOT glob expressions, and I only want filename expansion.

What I have found that DOES work (but overkill and a hack) is just to shell
out to zsh again, while passing in all options that are currently set --
plus globdots.

    () {
        set -x
        yo() {
            local myopts=( $(setopt) globdots )
            local myargs=()
            local arg
            for arg in "$@"; do
                myargs+=( "$(zsh -c "setopt $o &>/dev/null; command echo
$arg" )" )
        touch .hidden_file
        noglob yo echo *hidden*(mm-1)

This of course is wasteful, and I expect there's a better solution.

Then there's also the issue of causing filename expansion to occur when
unintended -- for example, if '*' is indeed just a string argument, and
should not be subject to expansion.  I think this corner case I can ignore,
as any user will explicitly be asking for glob expansion.

*Finally, I wanted to say that I genuinely appreciate the help and answers
I've gotten from this community.  You're all very welcoming, experienced,
and get down to the point / answers quickly.  If there's any way that I can
help support Zsh development or the community around it, please let me

*Zach Riggle*

[-- Attachment #2: Type: text/html, Size: 4341 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-11-24  2:21 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-21  4:46 Setting GLOB_DOTS for a single command Zach Riggle
2021-11-21  5:11 ` FW: " agkozak
2021-11-21  5:20   ` Bart Schaefer
2021-11-21  5:28 ` Lawrence Velázquez
2021-11-24  2:20   ` Zach Riggle
2021-11-21  5:36 ` Bart Schaefer
2021-11-21  5:38   ` Bart Schaefer

Code repositories for project(s) associated with this inbox:


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).