你能通过管道连接到 .bash_profile 函数吗?

你能通过管道连接到 .bash_profile 函数吗?

我收到了一个很棒的功能,可以使用命令行在 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,但这似乎也没有帮助。

有谁知道如何将路径/文件从grep管道传输xargs到 .bash_profile 函数?

答案1

label要与您通话xargs可以尝试这样的操作:

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函数导出到 调用的 shell xargs

  • -c选项指示bash从选项参数字符串中读取要执行的命令。

答案2

你为什么不反过来做呢?找到有问题的文件并循环处理它们,而不是使用xargs.这个网站和其他网站上的许多答案表明xargs,人们似乎认为它始终是完成这项工作的最佳工具。

find /Users/brett/Development/repos/my-repo/ -name "*.php" |
  while IFS= read -r file; do grep -Iil 'mysql_query(' "$file" && label 2 "$file"

此命令将查找.php文件,将每个文件保存为$file,运行grep它们,如果grep匹配,它将把它们传递给您的函数。我无法测试这个,因为我没有 Mac,但它应该工作得很好。

答案3

您不能在定义函数的 shell 实例之外使用该函数。由于此函数位于 中.bash_profile,因此它仅在登录 shell 中可用,而不能在 X 终端中启动的 shell 中使用(除了在终端中启动登录 shell 的 OSX 上),也不能在从文件或命令行运行脚本的 shell 中使用。函数不能被其他程序调用,例如xargs.

虽然有基于调用 shell 来启动函数的解决方法,但最简单的解决方案是将函数的代码放在脚本中。这样就可以从任何地方调用它。

并非所有函数都可以是独立脚本,因为独立脚本无法影响其父 shell(它们看不到非导出变量,无法在父 shell 中设置任何变量等)。在这里,您的函数不会执行任何需要在父 shell 内运行的操作,因此您不妨将其设为脚本。

相关内容