我想做什么
我创建了一个 shell 脚本,并已添加到我的$PATH中,该脚本将下载并为新的 Laravel 项目设置所有内容。我希望脚本通过将我的终端目录更改为新的项目文件夹来结束。
根据我现在的理解,它只是更改脚本实际运行的子shell的目录。我似乎不知道该怎么做。任何帮助,不胜感激。谢谢!
#! /usr/bin/env bash
echo -e ' 33[1;30m=========================================='
## check for a directory
if test -z "$1"; then
echo -e ' 33[0;31m✖ Please provide a directory name'
exit
fi
## check if directory already exist
if [ ! -d $1 ]; then
mkdir $1
else
echo -e ' 33[0;31m✖ The '"$1"' directory already exists'
exit
fi
# move to directory
cd $1
## Download Laravel
echo -e ' 33[0;32m+ 33[0mDownloading Laravel...'
curl -s -L https://github.com/laravel/laravel/zipball/master > laravel.zip
## Unzip, move, and clean up Laravel
echo -e ' 33[0;32m+ 33[0mUnzipping and cleaning up files...'
unzip -q laravel.zip
rm laravel.zip
cd *-laravel-*
mv * ..
cd ..
rm -R *-laravel-*
## Make the /storage directory writable
echo -e ' 33[0;32m+ 33[0mMaking /storage directory writable...'
chmod -R o+w storage
## Download and install the Generators
echo -e ' 33[0;32m+ 33[0mInstalling Generators...'
curl -s -L https://raw.github.com/JeffreyWay/Laravel-Generator/master/generate.php > application/tasks/generate.php
## Update the application key
echo -e ' 33[0;32m+ 33[0mUpdating Application Key...'
MD5=`date +”%N” | md5`
sed -ie 's/YourSecretKeyGoesHere!/'"$MD5"'/' application/config/application.php
rm application/config/application.phpe
## Create .gitignore and initial git if -git is passed
if [ "$2" == "-git" ]; then
echo -e ' 33[0;32m+ 33[0mInitiating git...'
touch .gitignore
curl -s -L https://raw.github.com/gist/4223565/be9f8e85f74a92c95e615ad1649c8d773e908036/.gitignore > .gitignore
# Create a local git repo
git init --quiet
git add * .gitignore
git commit -m 'Initial commit.' --quiet
fi
echo -e ' 33[1;30m=========================================='
echo -e ' 33[0;32m✔ Laravel Setup Complete 33[0m'
## Change parent shell directory to new directory
## Currently it's only changing in the sub shell
filepath=`pwd`
cd "$filepath"
从技术上讲,你可以source
脚本在父 shell 中运行它,而不是生成一个子 shell 来运行它。这样,您对当前 shell 所做的任何更改(包括更改目录)都会保留。
source /path/to/my/script/script
或
. /path/to/my/script/script
但采购有其自身的危险,请谨慎使用。
(外围相关:如何使用脚本更改目录)
使用 shell 函数前端脚本
setup () {
# first, call your big script.
# (It could be open-coded here but that might be a bit ugly.)
# then finally...
cd someplace
}
将 shell 函数放在 shell 启动文件中。
子进程(包括 shell)不能更改父进程的当前目录。 典型的解决方案是在父外壳中使用 eval。在 shell 脚本中,要由父 shell 运行的 echo 命令:
echo "cd $filepath"
在父 shell 中,你可以使用 eval 踢 shell 脚本:
eval `sh foo.sh`
请注意,所有标准输出都将作为 shell 命令执行。消息应输出为标准错误:
echo "Some messages" >&2
command ... >&2
这是不可能的。使用 exec
在相应的目录中打开一个新的 shell,替换脚本解释器。
exec bash
我想一种可能性是确保脚本的唯一输出是您想要结束的路径名,然后执行以下操作:
cd `/path/to/my/script`
您的脚本无法直接影响其父 shell 的环境(包括它的当前目录),但这将请求父 shell 本身根据脚本的输出更改目录......