'do shell script' med fler än en rad kod

Tråden skapades och har fått 6 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • International user
  • 2004-01-14 22:25

Den verkar inte gå att ha flera rader när man använder 'do shell script' i AppleScript.

Kod i AppleScript:
set sql1 to "MYSQL_HOME=/Applications/LassoProfessional6/LassoMySQL;CONNECT_STRING=\"bin/mysql --database=databasen --password=password --user=user\""

set sql2 to ";$MYSQL_HOME/$CONNECT_STRING << sql_kod
select count(*) from mytable;
sql_kod"

set sql to sql1 & sql2

do shell script sql

variabeln 'sql2' innehåller kod på flera rader. Detta fungerar inte, eller? Funkar dock bra i ett 'vanligt' sh-script.

Senast redigerat 2004-01-15 15:22

det är ibland rent ut sagt ett litet he*e att få strängarna rätt när man skickar saker till och från shell och AS och särskilt när man har nästlade citationstecken som du har men du skulle kunna börja med att lägga till följande rad före sista raden

set sql to (quoted form of sql)

men som sagt, det är dina citationstecken som ställer till det så du måste kanske "escape" dem

Senast redigerat 2004-01-14 23:25
  • Medlem
  • International user
  • 2004-01-15 11:02

1) Det finns inga citationstecken som inte är escapade.
2) 'set sql to (quoted form of sql)' genererar bara mer fel.

Problemet är kod på flera rader utan att använda semikolon, ';'. Vilket jag måste ha för att hantera MySQL i shellet med AppleScript.

Sorry, jag läste lite slarvigt. När du kör shell script så måste du sätta ihop alla dina rader i en variabel som skickas till Shell. På det får du ett enda svar. Det räcker heller inte med att du har de vanliga escapade sakerna i utan själva övergången från AS till Shell gör att du måste escapa denna enda sträng enligt särskilda regler. Jag citerar ett mail från en mailinglista som jag tror kan hjälpa:

--------

From: Chris Espinosa <cde@apple.com>
Date: Tue Aug 13, 2002 6:15:53 PM US/Central
To: applescript-users@lists.apple.com
Subject: do shell script with administrator privileges & shell commands

After working with a couple of different groups on this issue we've
discovered an awkwardness with the 'with administrator privileges'
option for the 'do shell script' command. We've found a workaround so
I'm writing this mini-tech note to let people know about it.

PROBLEM

'do shell script' executes its argument in a one-time process which
quits after it's complete, so you can't string together multiple 'do
shell script' commands that rely on the results of previous commands
(like setting working directories). So scripters are encouraged to do
multiline scripts in one 'do shell script' command like this:

do shell script "cd /Users" & (ascii character 10) & "pwd"

(ascii character 10 is the UNIX newline, which separates commands).
Unfortunately, the 'with administrator privileges' option only works on
UNIX commands that are implemented as files in the file system, not
those that are built in to the shell's command language. So multiline
scripts like the above will fail when used 'with administrator
privileges' if they include any shell commands.

SOLUTION

The solution is to write your entire shell script to a temporary file
and execute that file using 'do shell script', like so:

property newline : ASCII character 10
property tmpfile : "/tmp/execme"
property theShellScript : "cd /Users" & newline & "pwd" & newline &
"id" & newline

do shell script "echo " & quoted form of theShellScript & " > " &
tmpfile
do shell script "chmod +x " & tmpfile
do shell script tmpfile with administrator privileges

The 'tmpfile' property can be any path (we use the /tmp directory
because it's cleaned up routinely) and the 'theShellScript' property
should be the lines of your shell script separated by UNIX newline
characters. The script above simply writes the shell script to a
temporary file, makes it executable, and executes it with administrator
privileges. This way the script can contain both shell commands and
file-based commands.

NOTES

The most common problems with do shell script:

1) To conform to UNIX conventions, it uses /bin/sh as the shell. This
shell operates differently from the default shell (/bin/tcsh) used by
the Terminal, so you can't necessarily bring shell scripts straight
across from Terminal; you need to restrict your scripts to the
capabilities of /bin/sh

2) Environment variables that are set in your user login (like your
$PATH) are not pre-set for 'do shell script', so you may need to
specify explicit paths for some commands (like those in
/Developer/Tools).

3) 'do shell script' commands don't follow your normal user login
process; for example, the working directory is "/" (root), not your
user directory, so that scripts are more portable. You need to plan
for this in the shell scripts you execute.

4) As noted above, each 'do shell script' command is a separate
process, so you can't rely on context set in a previous command to be
in effect for subsequent ones.

5) It will wait until the command is complete and standard output and
standard error are closed before returning. If you try to use it to
execute a command in the background, you have to redirect standard out
and standard error in order to proceed with AppleScript execution:

do shell script "command > /dev/null 2>&1 &"

(The > /dev/null redirects standard output, the 2>&1 redirects
standard error, and the final & puts the command in the background.)

6) It doesn't set up terminal properties, so certain commands (like
'top') will not work unless they have command-line options that let
them work in a pipe or spooling to a file.

Chris Espinosa
Apple

Öppnar en gammal tråd igen här...

Raden "property theShellScript : "cd /Users" & newline & "pwd" & newline &
"id" & newline" i inlägget ovan fastnar jag på.

"pwd" är admin-lösenordet antar jag, men vad är "id". Admins kortnamn"

Tacksam för hjälp. Jag behöver kunna lägga exekveringen av FunnelWebs webloganalys som ett cron-jobb.

Testade igen nu.
Det går ju bra att köra den med "pwd" och "id" kvar som de är, men den frågar efter lösenordet, och det är det jag vill kunna scripta för att det ska vara någon mening med det.

Problemet löst. Det var förstås löjligt lätt:

set name to "script here"
do shell script name password "something" with administrator privileges

In i crontab med Cronnix. Klart! (Mitt script är en enradare så jag drabbas inte av problemen som beskrivs tidigare i den här tråden)

1
Bevaka tråden