我编写了一个脚本,它接受一个字符串作为参数,该字符串是用户名和项目的串联.该脚本应该切换(su)到用户名,cd到基于项目字符串的特定目录.
我基本上想做:
su $USERNAME;
cd /home/$USERNAME/$PROJECT;
svn update;
Run Code Online (Sandbox Code Playgroud)
问题是,一旦我做了su ...它只是在那里等待.这是有道理的,因为执行流程已经转移到用户.一旦我退出,其余的东西都会执行,但它不能按预期工作.
我将su添加到svn命令,但命令失败(即它没有更新所需目录中的svn).
如何编写允许用户切换用户并调用svn(以及其他内容)的脚本?
我正在尝试使用来自ENV的替换字符串创建脚本文件,但也希望防止一些转义
export PLACEHOLDER1="myPlaceholder1Value"
export PLACEHOLDER2="myPlaceholder2Value"
sudo /bin/su -c "cat << EOF > /etc/init.d/my-script
#!/bin/bash
#
### BEGIN INIT INFO
# Provides: my-script
# Required-Start: \$remote_fs \$syslog
# Required-Stop: \$remote_fs \$syslog
# Should-Start: \$network \$time
# Should-Stop: \$network \$time
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: blabla
# Description: bla bla desc
#
### END INIT INFO
#
myvariable_1=toto$PLACEHOLDER1
myvariable_2=titi$PLACEHOLDER2
myvariable_final=\"dynamicvar=\${myvariable_1},\${myvariable_2}\"
EOF
"
Run Code Online (Sandbox Code Playgroud)
由于myvariable_final没有被转义并被替换为init脚本依赖项中的一个($ remote_fs,$ syslog,$ network,$ time),因此结果不好.
#!/bin/bash
#
### BEGIN INIT …Run Code Online (Sandbox Code Playgroud) 我是一个shell脚本新手,所以我必须做一些愚蠢的事情,为什么这不会起作用:
#!/bin/sh
myFile=$1
while read line
do
ssh $USER@$line <<ENDSSH
ls -d foo* | wc -l
count=`ls -d foo* | wc -l`
echo $count
ENDSSH
done <$myfile
Run Code Online (Sandbox Code Playgroud)
应打印两行,每行应具有相同的值......但它们不具有相同的值.第一个print语句[ls -d foo*|的结果 wc -l]具有正确的值,第二个print语句不正确,它始终打印为空白.我需要做一些特殊的事情来将值分配给$ count吗?
我究竟做错了什么?
谢谢