Bash

您可以通過管道連接到 .bash_profile 函式嗎?

  • January 18, 2014

我收到了一個很棒的功能,可以使用命令行在 Apple 的 finder 中突出顯示文件。它基本上是 osascript 的包裝器。

我從Mac OS X 得到它:如何從終端更改文件的顏色標籤,它看起來像這樣,

# Set Finder label color
label(){
 if [ $# -lt 2 ]; then
   echo "USAGE: label [0-7] file1 [file2] ..."
   echo "Sets the Finder label (color) for files"
   echo "Default colors:"
   echo " 0  No color"
   echo " 1  Orange"
   echo " 2  Red"
   echo " 3  Yellow"
   echo " 4  Blue"
   echo " 5  Purple"
   echo " 6  Green"
   echo " 7  Gray"
 else
   osascript - "$@" << EOF
   on run argv
       set labelIndex to (item 1 of argv as number)
       repeat with i from 2 to (count of argv)
         tell application "Finder"
             set theFile to POSIX file (item i of argv) as alias
             set label index of theFile to labelIndex
         end tell
       end repeat
   end run
EOF
 fi
}

我將它放入 via vim .bash_profile,執行source .bash_profile並能夠使用label 2 /Users/brett/Desktop/test.txt. 完美的。

但是,如果我將所有舊的 PHP mysql_query( 語句更新到 PDO 並且我想直覺地突出顯示我需要編輯的文件怎麼辦?

我通常會跑步,

find /Users/brett/Development/repos/my-repo/ -name "*.php" -print0 | xargs -0 grep -Iil 'mysql_query(' | xargs -I '{}' -n 1 label 2 {}

但它回來了,

xargs: label: No such file or directory

我讀到我應該嘗試執行export -f label,但這似乎也無濟於事。

有誰知道我如何將路徑/文件從管道傳輸grepxargs.bash_profile 函式?

打電話labelxargs你可以嘗試這樣的事情:

export -f label
find /Users/brett/Development/repos/my-repo/ -name "*.php" -print0 |
 xargs -0 grep -Iil 'mysql_query(' |
 xargs -I {} -n 1 bash -c 'label 2 {}'

請注意label 2 {}在後一個xargs呼叫中如何更改為bash -c 'label 2 {}'. 由於xargs不能直接呼叫函式,我們將函式導出到父 shell 的label子程序,然後 fork 一個子 shell 並在那里處理函式。bash

筆記:

  • ~/.bash_profile通常不是由非登錄 shell 提供的,因此export -f label需要將label函式導出到由xargs.
  • -c選項告訴bash從選項參數字元串中讀取要執行的命令。

引用自:https://unix.stackexchange.com/questions/85217