Search code examples
bashapplescriptosascript

Multiline strings in osascript


I want to do this in bash:

read -r -d '' script <<'EOF'
echo 1
echo 2
echo 3
EOF

osascript -e "do shell script \"$script\" with administrator privileges"

# Output: 3
# Expected: 1
# 2
# 3

Only the last line is executed.

However, if I do just:

osascript -e "\"$script\""

# Output: echo 1
# echo 2
# echo 3
# Expected: echo 1
# echo 2
# echo 3

You can see all the lines are there.

How do I fix this?


Solution

  • Just add without altering line endings (though this will add a trailing newline character).

    read -r -d '' script <<'EOF'
    echo 1
    echo 2
    echo 3
    EOF
    
    osascript -e "do shell script \"$script\" with administrator privileges without altering line endings" | sed '$d'
    
    
    # See:
    # "do shell script in AppleScript",
    # http://developer.apple.com/library/mac/#technotes/tn2065/_index.html
    # ...
    # By default, do shell script transforms all the line endings in the result to 
    # Mac-style carriage returns ("\r" or ASCII character 13), and removes a single 
    # trailing line ending, if one exists. This means, for example, that the result
    # of do shell script \"echo foo; echo bar\" is \"foo\\rbar\", not the 
    # \"foo\\nbar\\n\" that echo actually returned. You can suppress both of 
    # these behaviors by adding the "without altering line endings" parameter. For 
    # dealing with non-ASCII data, see Dealing with Text.
    # ...