I am writing a script to automate setting up new projects for me.
this includes pulling down a github repository.
What I want to do is have some output from my script, then call git clone $repo
I want to show the output from that command while it is running, but then when it has run if it has run successfully replace it's output (note just the git commands output, I still want the output from before that to be there) with repository successfully cloned
and if failed just leave the output there, and print repository cloning failed
.
How can I do this?
Below is my current (rather simple) script.
#! /bin/bash
# -p project name
templateurl="[email protected]:xxx/xxx-site-template.git"
while getopts ":p:" opt; do #eventually I'll add more options here
case $opt in
p)
project=$OPTARG
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
if [ -z "$project" ]; then
echo "Project name required"
exit 1
fi
clear
echo "|==========================|"
echo "| New xxx Project Creator |"
echo "|==========================|"
echo "Project: $project"
if [ -d "$project" ]; then
echo "Directory $project already exists!"
exit 1
fi
mkdir $project
if [ ! -d "$project" ]; then
echo "Failed to create project directory!"
exit 1
fi
echo "Cloning xxx Template repository"
git clone $templateurl $project
i.e. redirect stderr to stdout and then capture the output. Otherwise when for error messages are written on stderr and your command: var=$(git status) is only capturing stdout .
Option One: Redirect Output to a File Only To use bash redirection, you run a command, specify the > or >> operator, and then provide the path of a file you want the output redirected to. > redirects the output of a command to a file, replacing the existing contents of the file.
git clone
does provide a exit code you can read with $? like follows:
git clone user@server:repo
echo $?
This will print 0 if everything worked just fine. If for example the folder is not a git repository you will get the exit code 128.
you can check if the clone worked as follows:
git clone user@server:repo localrepo --quiet
success=$?
if [[ $success -eq 0 ]];
then
echo "Repository successfully cloned."
else
echo "Something went wrong!"
fi
--quiet
will suppress any output from git, as long as there are no errors. So if you just remove the else-branch you will get you positive output or the error produced by git.
git clone user@server:repo localrepo > git.log 2>&1
if [[ $? eq 0 ]];
then
echo Repository successfully cloned.
else
cat git.log
echo Repository cloning failed.
fi
rm git.log
Explanation:
git clone user@server:repo localrepo > git.log 2>&1
Redirects stdout and stderr streams to git.log. > git.log
redirects stdout to git.log 2>&1
redirects stderr to the same place as stdout(thus, git.log).
$? eq 0
Checks the retcode of git which should be 0 if the clone was successful.
cat git.log
outputs the contents of the git.log file.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With