Automator: cambie al directorio seleccionado y ejecute el script de shell

Estoy tratando de crear un comando de menú contextual a través del servicio Automator. El comando del menú contextual ejecutará un script de shell para crear algunos documentos predeterminados en el directorio dado.

Escribí el script de shell que se ejecuta correctamente cuando se ejecuta desde el directorio de destino:

#!/bin/bash


touch History.markdown
touch Notes.markdown
touch Plan.markdown

touch ProjectName.tmproj

cat <<TEXT > ProjectName.tmproj
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>currentDocument</key>
    <string>Notes.markdown</string>
    <key>documents</key>
    <array>
        <dict>
            <key>filename</key>
            <string>Notes.markdown</string>
            <key>selected</key>
            <true/>
        </dict>
        <dict>
            <key>filename</key>
            <string>History.markdown</string>
        </dict>
        <dict>
            <key>filename</key>
            <string>Plan.markdown</string>
        </dict>
    </array>
    <key>openDocuments</key>
    <array>
        <string>History.markdown</string>
        <string>Notes.markdown</string>
        <string>Plan.markdown</string>
    </array>
    <key>fileHierarchyDrawerWidth</key>
    <integer>200</integer>
    <key>metaData</key>
    <dict/>
    <key>showFileHierarchyDrawer</key>
    <true/>
    <key>windowFrame</key>
    <string>{{113, 95}, {1230, 900}}</string>
</dict>
</plist>
TEXT

Luego abrí Automator y creé un nuevo servicio. Configuré el servicio para recibir la entrada seleccionada de foldersen Finder.

Luego agregué lo siguiente en la parte superior de mi script de shell para recibir el directorio seleccionado como entrada estándar:

FolderPath=$1
$(cd $FolderPath)

La variable FolderPathdefinitivamente obtiene el directorio actual. Agregué say $FolderPatha la secuencia de comandos de Shell y dice la ruta completa cuando se ejecuta desde el comando del menú contextual.

El problema es que cuando trato de cambiar al directorio en la variable, no pasa nada. Puse otro saycomando que pronunció el comando pwddespués del cambio de directorio y dice que estoy en la raíz de mi usuario.

¿Hay algo que Automator haga de manera diferente cuando se trata de scripts de shell?

Aquí hay una captura de pantalla de todo el servicio.ingrese la descripción de la imagen aquí

También debo mencionar que he intentado simplemente concatenar la ruta de la carpeta y el nombre del archivo que he intentado crear con el touchcomando y cuando lo hago, solo usa el nombre de la cadena del archivo para crear:

say "$FilePath/History.markdown" # only says "History dot markdown"

¡Cualquier ayuda sería muy apreciada!

¿ Por qué usas $(cd $FolderPath)en lugar de cd $FolderPath?
Lo intenté cd $FolderPathprimero y no funcionó, así que intenté forzar el comando $()y simplemente no lo saqué después de que todavía no funcionó.
No puede forzar un comando con $(), ejecútelo directamente bashpara ver qué sucede.
Con algunos comandos, puede forzarlo, $()ya que ejecuta el comando dentro de los paréntesis en una subcapa y devuelve el resultado (aunque mirando hacia atrás en mi comando ahora, no haría nada con el comando cd porque el alcance de la navegación es la subcapa). De cualquier manera, lo ejecuté en bash y funciona bien (lo construí originalmente para bash). Como prueba, escribí el siguiente comando que se ejecuta con éxito cuando se ejecuta desde un shell: say $(pwd) FolderPath="/Volumes/Secure/TEMP/" cd $FolderPath say $(pwd). La misma estructura utilizada en Automator no cambia correctamente el directorio.
Lo siento, me estaba quedando sin espacio en el último comentario. Si crea un servicio de automatización con solo los pasos: ` #!/bin/bash say $(pwd) FolderPath=$1 cd $FolderPath say $(pwd)' El buscador hablará el mismo directorio cada vez. En realidad, no cdcambia de directorio.

Respuestas (1)

El problema aquí es que la entrada se pasa a stdin. No sé por qué ese es el valor predeterminado, pero debería poder cambiar el menú emergente en la parte superior derecha a "como argumentos". Hice eso y agregué cd "$1"a la parte superior de la secuencia de comandos y funcionó.

¡Impresionante! Gracias por señalar eso. Lo cambié a as argumentsy todo funcionó como debería. ¡Gracias por la ayuda!