首先,我是shell脚本的新手。但我越来越喜欢它了。
我非常喜欢在终端上工作,这就是为什么我开始考虑通过创建个人提示来定制它以满足我的需求。你知道,pro devs - pro提示:-P
此刻我非常满意。它具有您希望提示的所有基本信息。
但我很想添加一个非标准的功能"在我的提示下,但我的新手正在踢我的屁股。
我想做的是创建一个方法,在当前目录中查找特定文件 - 在我的情况下为composer.json
。如果找不到它,它应该跳一级并在那里寻找它。如果在那里找不到它,它应该一次又一次地跳到另一个级别,直到它找到该文件。
在某些时候,您可能会点击根/
然后它应该中止。
问题是,我希望能够从composer.lock
文件中的几个专门安装的软件包中提取版本号,并在我的提示中显示它。
我似乎只是在当前目录中查找文件时遇到问题,但它是递归上升部分的问题。
我目前正在使用ZSH shell。不确定是否提供了一些其他功能来实现这一点,而不是Bash。
希望你们中的一些令人难以置信的开发者可以帮助一个shell粉丝。
如果我没有让自己足够清楚,或者有一些信息要求我提供,我就不要提及它,我会做任何事情。需要付出代价。
答案 0 :(得分:2)
我有点困惑......你说你正在寻找composer.json
但是在谈论composer.lock
???所以下面我将为您提供一个找到作曲家的脚本。锁定,您可以更改脚本开头的file
- 变量,如果您想要更改哪个文件寻找!
我接受了你的命令composer show -i | grep "laravel/framework
"可以在任何目录中找到文件composer.lock,就像你在评论中所说的那样。
因此,如果必须在不更改当前目录的情况下完成,则有两个选项:
最简洁的方法:使用pushd
将当前目录推送到堆栈,然后在退出之前使用popd
弹回目录。根据{{3}},我们不应该在没有参数的情况下调用pushd
一个区别是如果没有给出参数,则处理pushd的方式。与在csh中一样,这会交换目录堆栈的前两个元素
然后你可以试试这个:
file=composer.lock
unset failure
# pushd actually current directory and change to current directory
pushd .
while [ ! -f "$file" ]
do
if [ "$(pwd)" != "/" ]
then
cd ..
else
failure=true
break
fi
done
if [ -z "$failure" ]
then
echo Found file in $(pwd)
# Your command!
composer show -i | grep "laravel/framework"
popd
else
echo File $file could not be found! >&2
popd
exit 1
fi
exit 0
另一种选择是保存一个变量,该变量包含我们到目前为止所达到的目录。这样就可以在不改变目录的情况下搜索文件了!
file=composer.lock
unset failure
cpath=$(pwd)
while [ ! -f "$cpath/$file" ]
do
if [ "$cpath" != "/" ]
then
cpath=$(cd $cpath/.. && pwd)
else
failure=true
break
fi
done
if [ -z "$failure" ]
then
echo Found file in: $cpath
# do something with $cpath ...
else
echo File $file could not be found! >&2
exit 1
fi
exit 0
适用于sh
和bash
。由于我没有安装zsh
,我无法在zsh
中尝试,但我认为它也应该在那里工作。我不确定
如果您愿意,可以省略echo Found file in $(pwd)
。我把它放在那里用于测试目的