From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25087 invoked by alias); 15 Sep 2011 03:30:57 -0000 Mailing-List: contact zsh-users-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Users List List-Post: List-Help: X-Seq: 16356 Received: (qmail 8741 invoked from network); 15 Sep 2011 03:30:55 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.1 Received-SPF: none (ns1.primenet.com.au: domain at benizi.com does not designate permitted sender hosts) Date: Wed, 14 Sep 2011 23:30:20 -0400 (EDT) From: "Benjamin R. Haskell" To: TJ Luoma cc: Zsh Users Subject: Re: add 'sudo' to 'mv' if file isn't writable by $USER In-Reply-To: Message-ID: References: User-Agent: Alpine 2.01 (LNX 1266 2009-07-14) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1463810530-1819503178-1316057444=:10525" ---1463810530-1819503178-1316057444=:10525 Content-Type: TEXT/PLAIN; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8BIT 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" ---1463810530-1819503178-1316057444=:10525--