Automator: Seçilen dizine geç ve kabuk betiğini çalıştır


1

Automator servisi üzerinden bir içerik menüsü komutu oluşturmaya çalışıyorum. İçerik menüsü komutu, verilen dizinde bazı varsayılan belgeler oluşturmak için bir kabuk betiği çalıştırır.

Hedef dizinden çalıştırıldığında doğru çalışan kabuk betiğini yazdım:

#!/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

Daha sonra Automator'ı açtım ve yeni bir servis oluşturdum. Hizmeti, foldersiçinde seçilen girişi alacak şekilde ayarladım Finder.

Daha sonra, seçilen dizini standart girdi olarak almak için aşağıdakileri kabuk betiğimin üstüne ekledim:

FolderPath=$1
$(cd $FolderPath)

Değişken FolderPathkesinlikle geçerli dizini alır. Bir say $FolderPathkabuk betiğine bir a ekledim ve bağlam menü komutundan çalıştırıldığında tüm yolu belirtir.

Sorun, değişkendeki dizine geçmeye çalıştığımda hiçbir şeyin olmaması. Dizin değiştikten sonra saykomutu konuşan başka bir komut daha koydum pwdve kullanıcının kökünde olduğumu söylüyor.

Shell komut dosyaları ile uğraşırken otomatörün farklı yaptığı bir şey var mı?

İşte tüm hizmetin bir ekran görüntüsü. görüntü tanımını buraya girin

Ayrıca sadece klasör yolunu ve touchkomut ile oluşturmaya çalıştığım dosya adını birleştirmeyi denedim ve bunu yaptığımda yalnızca oluşturmak için dosyanın dize adını kullanır:

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

Herhangi bir yardım çok takdir edilecektir!


Neden $(cd $FolderPath)yerine kullanıyorsunuz cd $FolderPath?
nohillside

cd $FolderPathİlk önce denedim ve işe yaramadı, ben de emri zorla vermeye çalıştım $()ve hala işe yaramadıktan sonra çekip açmadım.
Chris Schmitz

1
Sen olamaz zorlamak ile bir komut $(), doğrudan çalıştırmak bashne olacağını görmek için.
nohillside

Bazı komutlarda $(), komutu bir alt kabuktaki parens içindeki komutu çalıştırdığında kullanmaya zorlayabilir ve sonucu döndürür (benim komutuma bakıldığında yine de cd komutuyla hiçbir şey yapmaz, çünkü navigasyonun kapsamı alt kabuktur). Her iki durumda da, bash'de çalıştırdım ve iyi çalışıyor (başlangıçta bash için yaptım). Az önce bir test olarak, bir kabuk çalıştırdığınızda başarıyla yürütür aşağıdaki komutu yazdı: say $(pwd) FolderPath="/Volumes/Secure/TEMP/" cd $FolderPath say $(pwd). Automator'da kullanılan aynı yapı, dizini başarıyla değiştirmez.
Chris Schmitz

Maalesef, son yorumda yerimiz tükeniyordu. Sadece adımlarla bir otomator servisi yaratırsanız: `#! / Bin / bash say $ (pwd) FolderPath = $ 1 cd $ FolderPath say $ (pwd) 'Bulucu her seferinde aynı dizini konuşur. Bu cdaslında dizinleri değiştirmez.
Chris Schmitz

Yanıtlar:


3

Buradaki sorun, girdilerin iletilmesidir stdin. Bunun neden varsayılan olduğunu bilmiyorum, ancak sağ üstteki açılır menüyü "bağımsız değişkenler" olarak değiştirebilmelisiniz. Bunu yaptım ve cd "$1"senaryonun üstüne ekledim ve işe yaradı.


Korku veren! Bunu gösterdiğin için teşekkürler. Anahtarladım as argumentsve her şey olması gerektiği gibi çalıştı. Yardım için teşekkürler!
Chris Schmitz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.