zsh-users
 help / color / mirror / code / Atom feed
From: "Benjamin R. Haskell" <zsh@benizi.com>
To: TJ Luoma <luomat@gmail.com>
Cc: Zsh Users <zsh-users@zsh.org>
Subject: Re: add 'sudo' to 'mv' if file isn't writable by $USER
Date: Wed, 14 Sep 2011 23:30:20 -0400 (EDT)	[thread overview]
Message-ID: <alpine.LNX.2.01.1109142305551.10525@hp.internal> (raw)
In-Reply-To: <CADjGqHtVg9bnFTHE2gk59m3cnnLsWJjzYAgr9V4=gioPbxPnHg@mail.gmail.com>

[-- Attachment #1: Type: TEXT/PLAIN, Size: 2203 bytes --]

On Wed, 14 Sep 2011, TJ Luoma wrote:

> I'm wondering if someone has already done this.
>
> I have a function which does this:
>
>
> move () {
> 	command which -s gmv
> 	if [ "$?" = "0" ]
> 	then
> 		gmv --verbose --backup=numbered $@
> 	else
> 		mv -v -i $@
> 	fi
> }
>
> (simply put: use 'gmv' if it exists, otherwise use 'mv')
>
> That works pretty well (although if there are ways to do it better, 
> please let me know).

There's a pretty common zsh idiom to avoid the use of 'which' or 'where':

(( $+commands[command-name] ))

So:

move () {
     if (( $+commands[gmv] )) ; then
         gmv --verbose --backup=numbered $@
     else
         mv -v -i $@
     fi
}

> HOWEVER, now I want to do
>
> "If $FILE is writable by $USER, do 'move' as above. ELSE use 'sudo' 
> before the mv or gmv command"
>
> I can probably cobble together a solution, but I thought I'd check 
> first to see if someone here had already invented this wheel.

For some things, I have it set up to:
1. try to do the thing
2. if it fails, try with sudo

E.g.:

mkdirp () { mkdir -p $argv || sudo mkdir -p $argv }

You get an extra warning when sudo's needed, but sometimes that's useful 
info.  And the code's pretty simple.  (Not sure why I prefer $argv over 
$@, exactly.)  Maybe dangerous in the case of a move (if some, but not 
all, of the files are successfully moved without sudo).


For this particular problem, maybe something along the lines of:

move () {
     local -a cmd

     # check that destination is writable
     # or destination doesn't exist, but its dir is writable
     # otherwise, need sudo
     [[ -w $argv[-1] ]] || [[ ( ! -e $argv[-1] ) && -w ${argv[-1]}:h ]] || cmd+=( sudo )

     if (( $+commands[gmv] )) ; then
         cmd+=( gmv --verbose --backup=numbered )
     else
         cmd+=( mv -v -i )
     fi

     $cmd $argv
}

In a lot of cases, I would probably shorten:

if (( $+commands[blah] )) ; then
     # x
else
     # y
fi

when x and y both always return true¹, to:

(( $+commands[blah] )) && x || y

But that makes for a pretty long line here:

(( $+commands[gmv] )) && cmd+=( gmv --verbose --backup=numbered ) || cmd+=( mv -v -i )

-- 
Best,
Ben

¹: for most values of "always"

  reply	other threads:[~2011-09-15  3:30 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-14 22:19 TJ Luoma
2011-09-15  3:30 ` Benjamin R. Haskell [this message]
2011-09-15 18:20   ` TJ Luoma

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=alpine.LNX.2.01.1109142305551.10525@hp.internal \
    --to=zsh@benizi.com \
    --cc=luomat@gmail.com \
    --cc=zsh-users@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

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).