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"
next prev parent 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).