![]() |
|
![]() |
|
|
Thread Tools | Display Modes |
|
|
#1 |
|
The Oblivious One
Join Date: May 2005
Location: Ontario, Canada
Posts: 640
Rep Power: 4
![]() |
Strange problem with redirection
I'm very new to all this, so I'm sure it's something obvious.
There's a program that is packaged with Archlinux called rankmirrors that takes a repository mirror list (in /etc/pacman.d) and returns a list of sorted mirrors based on speed. I glanced at a BASH scrpting tutorial and came up with this: #!/bin/bash
# Rank all mirrors and save changes to
# files. Uses the rankmirrors script bundled with
# Pacman 3
# By Jesse H-K
# 2007 - 04 - 09 (April 9th)
root_uid=0
mirror_dir=/etc/pacman.d
rankmirror_script=/usr/bin/rankmirrors
if [ $UID != $root_uid ]; then
echo "Please run this script as root."
exit 1
elif [ ! -d $mirror_dir ]; then
echo "$mirror_dir not found!"
exit 1
elif [ ! -e rankmirror_script ]; then
echo "Unable to find rankmirrors script!"
exit 1
fi
cd $mirror_dir
mirror_files=`ls`
for mirror in $mirror_files; do
# replace the old file with the output
# rankmirros.
rankmirrors $mirror > $mirror
done
exit 0Where the /etc/pacman.d consists of the files: $ ls /etc/pacman.d community current extra release testing unstable For some reason, the script deletes all the mirrors in each file and leaves an empty file with the header "Mirror file generated by rankmirrors on $date" where $date is obviously the date. However, when I run rankmirrors on a script and redirect the output to a differently named file like so: $ rankmirrors current > current.new Everything works normally. What am I doing wrong?
__________________
Dr. Zoidberg: [ecstatic] I'm going to a movie... with FRIENDS! |
|
|
|
|
|
#2 |
|
Resident Grouch
![]() ![]() ![]() ![]() ![]() ![]() Join Date: Jun 2005
Posts: 6,453
Rep Power: 10
![]() |
You realize you're redirecting the output to the same file?
__________________
Abstraction doesn't make it impossible to write bad code; it makes it possible to write superior code. Contributor's Corner: Grumpy on C++ Exceptions DaWei on Pointers |
|
|
|
|
|
#3 |
|
The Oblivious One
Join Date: May 2005
Location: Ontario, Canada
Posts: 640
Rep Power: 4
![]() |
But shouldn't that work? As I see it, I'm overwriting the file with the output of the script (I'm sure there's something wrong with the way I see it though :p).
__________________
Dr. Zoidberg: [ecstatic] I'm going to a movie... with FRIENDS! |
|
|
|
|
|
#4 |
|
Resident Grouch
![]() ![]() ![]() ![]() ![]() ![]() Join Date: Jun 2005
Posts: 6,453
Rep Power: 10
![]() |
That presumes synchronized read/write or adequate buffering, both of which are implementation dependent. Have you established that a hand-implementation of:
$ rankmirrors current > current.new is equivalent to: rankmirrors $mirror > $mirror ??
__________________
Abstraction doesn't make it impossible to write bad code; it makes it possible to write superior code. Contributor's Corner: Grumpy on C++ Exceptions DaWei on Pointers |
|
|
|
|
|
#5 | |
|
Battle Programmer
Join Date: Feb 2006
Location: Bellevue, WA, USA
Posts: 751
Rep Power: 3
![]() |
from man bash:
Quote:
__________________
<insert disclaimer here> <insert shameless plug for Visual Studio here> |
|
|
|
|
|
|
#6 |
|
Professional Programmer
Join Date: Mar 2005
Location: Glasgow, Scotland
Posts: 317
Rep Power: 4
![]() |
Yup, it does. The filename is passed as an argument to the command, and the shell will set itself up for I/O redirection right at the start so by the time rankmirrors starts the file will have been stomped.
I don't know enough about shell programming to be honest (terrible, I need to learn but never get around to it because I use Perl for virtually all my scripting so my knowledge of bash scripting is restricted to extremely simple scripts and tweaking existing ones). Would it be possible to write rankmirrors to read its input from standard input rather than a file identified on the command line so you could do one of: rankmirrors < $mirror > $mirror cat $mirror | rankmirrors > $mirror Unfortunately I'm not actually certain this would fix the issue! Also, I'm not sure if this is helpful but I've been known to find it useful that Linux will not obliterate a deleted file until everything using it has closed it - is there any way to open it for input, delete it, and then open it for writing? That way the old and new versions can co-exist with the old version visible only to code that has already opened it. The deletion of the old one only really happens when you close it that way, but it has no name so the new and old don't collide. If I was a bit less lazy I'd have actually checked to see if any of this works, but I'm not - hopefully something I've said here is of some use to you!
__________________
"I'm not a genius. Why do I have to suffer?" |
|
|
|
|
|
#7 |
|
The Oblivious One
Join Date: May 2005
Location: Ontario, Canada
Posts: 640
Rep Power: 4
![]() |
Actually, my solution in the end was to redirect the output to a different file:
rankmirrors $mirror > ${mirror}_newand then to rename it following the sorting operations: mv ${mirror}_new $mirrorWhile of course first making a ${mirror}.bak of every file first. ![]() Thanks for all the advice. I've actually just purchased O'Reilly's "Classic Shell Scripting" which covers Awk, Sed, and Bash in detail. I figured it was about time. ![]()
__________________
Dr. Zoidberg: [ecstatic] I'm going to a movie... with FRIENDS! |
|
|
|
|
|
#8 |
|
Professional Programmer
Join Date: Mar 2005
Location: Glasgow, Scotland
Posts: 317
Rep Power: 4
![]() |
Yeah, I think I should get a copy of that too.
__________________
"I'm not a genius. Why do I have to suffer?" |
|
|
|
![]() |
| Bookmarks |
| Currently Active Users Viewing This Thread: 1 (0 members and 1 guests) | |
| Thread Tools | |
| Display Modes | |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Strange getMonth/setMonth problem | aaroncampbell | JavaScript and Client-Side Browser Scripting | 4 | Oct 31st, 2006 2:49 PM |
| strange problem | brad sue | C++ | 3 | Sep 1st, 2006 8:50 AM |
| Strange Problem? | magic_e | PHP | 10 | Feb 9th, 2006 8:54 PM |
| cgi/perl script + IE problem | joyceshee | Perl | 2 | Jan 24th, 2006 11:10 AM |
| string problem when passing in linked list | quantz | C++ | 0 | Feb 27th, 2005 10:11 AM |