Programming :: BASH - Works On The Command Line, Hangs As A Script?
Jul 16, 2010
I'm writing a Bash script to take IPTC keywords from a text file and write them, via Exiv2, to several (first batch is 100) JPEG files in a single directory. The script has one while loop inside another while loop, both terminated, but I'm pretty sure that's not my problem. I think it's how I'm incrementing the "counter" variable, although it could also be the method of parsing the text lines from the file (using cut with delimiters that have worked fine in simpler scripts).
Here's the code as I've worked it up to this point.
Code:
And yes, "keywords" checks out in Crimson Editor, Emacs GUI and nano as an ASCII file with UNIX line endings. No issues on that score.
Feeding each line consecutively into a terminal (excepting the exiv2 command) works fine: each variable echoes with the part of the text line used as a variable value as it should, even when the b variable is incremented the quick&dirty way (up arrow three commands and hit enter).
Running the above script in eval mode (sh -x) stalls after setting the b variable to one and reading in the first line of text. I'd like to know why. I'd also like some advice on another reliable method of parsing the read-in lines.
Writing script to create backup of file by adding datetime to file name. Basically test for file presence if there, cp with datetime then rm original cp works fine from command line but get cannot stat `full path to file': No such file or directory
Code:
Here are the errors: cp: cannot stat `~/html/CVP_dadamail/.dada_files/.logs/errors.txt': No such file or directory rm: cannot remove `...': No such file or directory
The for statement is a placeholder as I have same file to backup out of several directories. using "bash -x scriptname" -OR- inserting echos, I can see I've constructed the strings properly. Believing it might be related to the hidden directories, I tried setting the shopt "glob" options to no avail.
Ultimately I'll add the other directories to the for loop and then run this from a cron job, so if you see potential pitfalls knowing I'm headed in that direction...believe construct would be
I wonder if there is anyway to make a user-defined bash shell function global, meaning the function can be use in any bash shell scripts, interactively or not. This is what I attempted:
Trying to create a small script that will read user's input, test if user entered some input and if not display some message or display a text using user's input.
The script is the following but i get an error saying "[: 6: =: argument expected"
I would like to know how do I print the line # in a script. My requirement is, I have a script which is about ~5000 lines long. If there are any errors happen I just exit. And I would like to add the line # of the script where the error happened.
bash 3.1.17(2) I'm trying do write a shell script which must operate on each line of an ASCII text file. So, all the code must be inside a loop, and inside the loop, the first thing should be to read the next line from the file. I have the bash read command. But it reads from stdin. Any way to make read from a file?
I'm trying to make another file annotation script a little speedier than it has been by the up-until-now proven method of checking the last four characters in a filename before the "dot" (eg .jpg, .psd) against a list of known IPTC categories and Exiv2 command files. It occurred to me that if one script generated a list of files in directory foo, and the same or another script sorted that list by that four-letter tag,then that list could be used(instead of a for/do/done loop on the real files in the folder) by the command-file-matching script to "vomit out" which annotator file would go with file nastynewfile.jpg, f'r'instance. The script I had been using for this task looks like this:
Code:
while read 'line'; do sp=$(echo $line) vc=$(echo $sp | cut -d"," -f1) cv=$(echo $sp | cut -d"," -f2)
[code]....
Where I seem to be stuck is with how to sort the lines in templist, which may be any number of different lengths, from back to front. sort -k looked promising, except it seems only to work the other way round. I thought of invoking a
Code:
q=$(expr length $line); echo $q n=$[q-8]; echo $n
kind of thing, but that presented the problems of how to sort by those, how to tell sort where to find them (grep?) and how to "stitch them back in" to the original list, which is what I want to sort in the first place.
I have two Roboards that need to communicate with one another. I have sucessfully installed Ubuntu 9.04 using the 386 kernel based on instructions found online.I can use the GUI to set up an Ad-Hoc network using one Roboard ("Create New Wireless Network"), call it Manet, and connect to "Manet" using the GUI on the other Roboard and ping/ssh between the boards. However, when I try to create the same wireless network using the command line using:
ifconfig wlan2 down iwconfig wlan2 key off essid 'Manet' channel 5 ap any ifconfig wlan2 up
I don't see any entry in iwconfig under "Cell". It keeps giving me "Not Associated"When I try to enter the same information on the other Roboard to try to connect to the network, it doesn't connect and under iwconfig, I don't even see any entry for ESSID. Could somebody please tell me why it works when I use the GUI and not the command line.
Does anyone know why Nautilus would allow me to login to a server but not display any files, but when I log in via the 'ftp' command-line binary, it works and allows me to display all the files, make directories, etc.? I was able to login via FileZilla too.
Here's part of the log: Code: Response:220 Microsoft FTP Service Command:USER ---- Response:331 Password required for ----. Command:PASS *********** Response:230-Welcome to the Alentus FTP server. Response:230 User ---- logged in. Command:SYST Response:215 Windows_NT Command:FEAT Response:211-FEAT Response:SIZE Response:MDTM Response:211 END Status:Connected Status:Retrieving directory listing...
I've been using linux for a long time, and I just ran into a problem that has me stumped. Any time I mistype a command, it says "Command not found."... yea, I know that's normal. But it doesn't return me to my # prompt. I have to press Ctrl+C to get back. code...
I know I do have one issue with this computer, I have 2 blown caps on my motherboard. This was a dual boot system, but after a virus with winblows, I decided to switch it to strictly linux. (roommates... *grumble*) I think I was running fc10 before I wiped the hd & installed fc12. Fc12 does seem to be running slower, and I still haven't got my sound card working properly... but that issue is for another topic... -YungBlood Reborn
I'm trying to configure sending mail from my site under Ubuntu 10.04 LTS.I have installed LAMP and postfix. To test mail I created the file test.php with code:
PHP Code: $to = 'mymail@gmail.com'; $subject = 'The subject';
Having an odd problem running a mysqldump via crontab. I have the script running on other servers and they work fine, so not sure how to actually troubleshoot, but the script looks like the following;
If I run it as a cronjob as root, it finishes in a second and a 20k file is there. If I run it from the command line as root it does the backup (takes a few minutes) but does complete the backup and can be unzipped and read successfully.
I am attempting to start ruby in interactive mode from the command line. However, when I type ruby at the command line, it simply hangs. I know that I have ruby installed. Any ideas as to how to resolve this problem.
How can I verify JavaScript on a site (not on the same server) is working from command line access of the URL?
On checking some of what was written in 2005 I find most of it isn't still relevant (if it was then - I noted the w3m-js stuff mentioned in 2005 hadn't been updated since 2003).
Since then a couple of times I've looked into it but didn't make much headway but also didn't spend a lot of time on it. So far as I could tell from other posts I'd seen others hadn't either.
Recently I found out about Mozilla's SpiderMoneky js library and that it could be linked into elinks text browser and did same on my RHEL5 system.
I found Spidermonkey rpms in the EPEL (Fedora sponsored) repository: js-1.70-8.el5.i386.rpm js-1.70-8.el5.x86_64.rpm js-devel-1.70-8.el5.i386.rpm js-devel-1.70-8.el5.x86_64.rpm
I was able to download and install using rpm then compile elinks from source to include the above. Running elinks version after that shows the ECMAScript support is compiled into the new elinks binary. Also setting various ecmas* flags in the elinks.conf does have effect so clearly it is using them. (As opposed to another system where I use the original RHEL5 provided elinks RPM it complains about the ecmas* stuff being invalid options.)
It appears that by default it has this enabled but just for good measure I added:
set ecmascript.enable = 1.
Despite that when I pull up the page I see:
This product requires use of a browser that supports JavaScript
As a test I set the above to 0 on the off chance it was backwards and saw the same thing.
I then set the following:
set ecmascript.error_reporting = 1
On pulling up the page I now see a popup box:
Quote:
JavaScript Error:
A script embedded in the current document raised the
following exception:
TypeError: Window.Focus is not a function
OK
That seems to suggest that despite the earlier message about needing a browser that supports JavaScript that it is in fact executing at least one JS but that it is getting an error. Can anyone confirm that?
Does anyone have any idea what I�d need to do to deal with the Window.Focus message?
Essentially the site is a login page and even though I am able to input username and password after opening in browser when I tell it to POST it simply returns to the same login/password page.
And of course it doesn't have to be elinks/spidermonkey. I'd be interested in finding out if anyone knows a way I can verify a site that is running JavaScript is actually responding properly from command line rather than via a browser?
The SpiderMonkey stuff from Mozilla when compiled into elinks is supposed to do that but given my results Im not sure if it is or not.
Most of the documentation I can find on JavaScript stuff appears to be aimed at developers testing their own JS code from command line rather than accessing a web page with JavaScript.
So, in finishing my nFlux slack current edition.I have set it up for users to do certain things in console and one of the things I want is a way to view slackbook-2.0 in runlevel 3 console.I cant find a pdf reader that works in command line mode and I cant figure out how to either convert slackbook 2.0 pdf into html/text Or find a slackbook download that is html or text?I tried converting it using pdftotext, which didnt work very well So, I need a command line pdf viewer or a converter that works good?
I want to write the date & time and a text string to a file from crontab.The following line works fine in the CL:echo $(/bin/date +"%F %T")" Some text" >> /home/me/foo.txtI installed in crontab and no text appears in the file that it is redirected to.The crontab entry looks like:* * * * * echo $(/bin/date +"%F %T")" Some text" >> /home/me/foo.txtTried a version to just write to stdout....* * * * * echo $(/bin/date +"%F %T")" Some text"No date, time or text appears at the command line
I've successfully mounted a network share with mount.cifs for the past 2 years using fstab with credfile.
[Code]....
Yesterday I moved this system to a new datacenter, but did not alter fstab or the credfile. The //server/share directory has IP rules in place, but this was updated with the new system IP while we moved the system. Now, I am mysteriously unable to automount //server/share. The local error is 13 (permission denied). The Windows server we are mounting returned a code that is defined as "username is valid but password is incorrect" Again - no changes (content or permissions) were made to my credfile or fstab entry. I've restarted netfs a few times, including rebooting the system twice. What is baffling is I can successfully mount //server/share via command line: Code: mount -t cifs //server/share /mnt/mycooldir -o username=foobar,password=1234
The username and passwords are identical in credfile and the mount options - I copied & pasted username / password from the credfile itself.
I am looking for a way to delete the currently entered commandline without wasting seconds on the "Backspace"-key.
For example I scrolled the bash history and have a long commandline that would execute when I pressed ENTER:
~$ aptitude search openssl | grep dev
But now I decide that I do not want to execute this command. Can I get an empty prompt fast without deleting the whole line with Backspace? On the Windows "cmd" you can just press ESCAPE and it is gone. This behavior would be what I want.
The question may seem trivial but this is bothering me for a long time now.
$cmd If this script is executed, an error is generated. The reason written was that "The execution fails because the pipe is not expanded and is passed to date as an argument".What is meant by expansion of pipe. When we execute date | wc on the command line, it goes fine.then | is not treated as an argument. Why?
I am trying to learn how to pass more than a one-command startup for gnome-terminal.
I will give an example of what I'm trying to do here:
Code: #! /bin/bash # #TODO write this for gnome and xterm USAGE=" ${0##*/} [-x] [-g] code....
However, running with the -g option to invoke gnome-terminal, I get a "There was an error creating the child process for this terminal" error.
This same error occurs if the gnome-terminal line is changed to
Code: gnome-terminal -e mcTerm
Is there any way to pass more than one command on to gnome-terminal? I have tried various single and double quoting senarios and in a final attempt, I abstracted to an exported function all to no avail. Perhaps even though gnome-term is better at many things than xterm, xterm trumps it in this instance.
I've written myself a linux program "program" that does something with a regular expression. I want to call the program in the bash shell and pass that regular expression as a command line argument to the program(there are also other command line arguments). A typical regular expression looks like "[abc]_[x|y]".Unfortunately the characters [, ], and | are special characters in bash. Thus, calling "program [abc]_[x|y] anotheragument" doesn't work. Is there a way to pass the expression by using some sort of escape characters or quotation marks etc.?
(Calling program "[abc]_[x|y] anotheragument" isn't working either, because it interprets the two arguments as one.)
I've written myself a linux program "program" that does something with a regular expression. I want to call the program in the bash shell and pass that regular expression as a command line argument to the program (there are also other command line arguments). A typical regular expression looks like "[abc]_[x|y]". Unfortunately the characters [, ], and | are special characters in bash. Thus, calling "program [abc]_[x|y] anotheragument" doesn't work. Is there a way to pass the expression by using some sort of escape characters or quotation marks etc.? (Calling program "[abc]_[x|y] anotheragument" isn't working either, because it interprets the two arguments as one.)