![你能通过管道连接到 .bash_profile 函数吗?](https://linux22.com/image/50480/%E4%BD%A0%E8%83%BD%E9%80%9A%E8%BF%87%E7%AE%A1%E9%81%93%E8%BF%9E%E6%8E%A5%E5%88%B0%20.bash_profile%20%E5%87%BD%E6%95%B0%E5%90%97%EF%BC%9F.png)
我收到了一个很棒的功能,可以使用命令行在 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
函数导出到 调用的 shellxargs
。该
-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 内运行的操作,因此您不妨将其设为脚本。