为什么我的bash脚本中不断显示“ cp:不能统计”:没有这样的文件或目录或“ cp:缺少操作符”

时间:2018-08-18 05:49:57

标签: linux bash shell variables directory

我正在编写一个脚本来设置debian安装,这个错误使我感到沮丧:

问题:

cp "$BASHRC" "$HOME"/.bashrc

给予:

  

+ sudo -u Billy bash

     

cp:无法统计”:没有此类文件或目录

     

     

cp:缺少操作符

这是脚本:

这些文件位于脚本所在的当前目录中...

 17 BASHRC=.bashrc
 18 NANORC=.nanorc
 19 BASHRCROOT=.bashrcroot 

#!/bin/bash -x
  2
  3 SCRIPTNAME=`basename "$0"`
  4
  5 if [ "$#" -eq 0 ]
  6 then
  7     echo "No arguments supplied"
  8     echo "Usage: $SCRIPTNAME user1name user2name\(optional\) user3name\(optional\)"
  9 fi
 10
 11 echo "Here starts the party, "
 12 echo "This program should be run as root, please wait"
 13 echo "Setting up server.........."
 14
 15 DIRBASHRCROOT="$HOME"/.bashrcroot
 16 DIRBASHRC="$HOME"/.bashrc
 17 BASHRC=.bashrc
 18 NANORC=.nanorc
 19 BASHRCROOT=.bashrcroot
 20 ROOT=root
 21 USER1="$1"
 22 USER2="$2"
 23 USER3="$3"
 24
 25 ################ Users and access settings #####################
 26 #echo username1 ALL=(username2) NOPASSWD: /bin/bash /path/to/svn >> /etc/sudoers
 27 #echo `users` | grep "$1" && echo User $1 exists
 28 #sudo -u username2 -H sh -c "cd /home/$USERNAME/$PROJECT; svn update"
 29 #useradd -m -s /bin/bash "$different_user"
 30 #id -u $USER1
 31 checkIfUser()
 32 {
 33     for name in "$@"
 34     do
 35         if id -u "$name" #>/dev/null 2>&1
 36         then
 37             echo 'User: "$name" exists....setting up now\!'
 38         else
 39             echo 'User: "$name" does not exists....creating now\!'
 40             useradd -m -s /bin/bash "$name" #>/dev/null 2>&1
 41         fi
 42     done
 43 }
 44 checkIfUser $1 $2 $3
 45 ################ NANO SYNTAX-HIGHLIGHTING #####################3
 46 sleep 3
 47
 48
 49
 50 
 51 
 52 if [ "$UID" != 0 ]
 53 then
 54    sudo -u "$ROOT" bash <<'EOF'
 55    sleep 5
 56    git clone https://github.com/nanorc/nanorc.git
 57    sleep 5
 58    cd nanorc
 59    make install-global
 60    sleep 5
 61    cp "$NANORC" /etc/nanorc
 62
 63    if [ "$?" = 0 ]
 64    then
 65        echo "Implementing a custom nanorc file succeeded\!"
 66    fi
 67EOF
 68 else
 69     git clone https://github.com/nanorc/nanorc.git
 70     sleep 5
 71     cd nanorc
 72     sleep 5
 73     make install-global
 74     sleep 5
 75     cp "$NANORC" /etc/nanorc
 76
 77     if [ "$?" = 0 ]
 78     then
 79         echo "Implementing a custom nanorc file succeeded\!"
 80     fi
 81 fi
 82
 83 echo "Finished setting up nano\!"
 84 ################ LS_COLORS SETTINGS #############################

 86 if [ "$UID" != 0 ]
 87 then
 88     sudo -u "$ROOT" bash <<'EOF'
 89     cp "$BASHRCROOT" "$HOME"/.bashrc
 90     wget https://raw.github.com/trapd00r/LS_COLORS/master/LS_COLORS -O "$HOME"/.dircolors
 91     echo 'eval $(dircolors -b $HOME/.dircolors)' >> "$HOME"/.bashrc
 92     . "$HOME"/.bashrc
 93     echo "Here is LS_COLORS in action: "
 94     ls -l "$HOME"/
 95 EOF
 96 else
 97     cp "$BASHRCROOT" $(eval echo "$HOME"/.bashrc)
 98     sleep 5
 99     wget https://raw.github.com/trapd00r/LS_COLORS/master/LS_COLORS -O "$HOME"/.dircolors
100     sleep 5
101     echo 'eval $(dircolors -b $HOME/.dircolors)' >> "$HOME"/.bashrc
102     sleep 5
103     . "$HOME"/.bashrc
104     echo "Here is LS_COLORS in action: "
105     sleep 5
106     ls -l "$HOME"/
107 fi
108 if [ ! -z "$USER1" ]
109 then
110     sudo -u "$USER1" bash <<'EOF'
111     sleep 5


THESE GUY'S ARE THE CULPRIT↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    112     cp "$BASHRC" "$HOME"/.bashrc
HERE IS THE PROBLEM ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
113     sleep 5
114     wget https://raw.github.com/trapd00r/LS_COLORS/master/LS_COLORS -O "$HOME"/.dircolors
  sleep 5
116     echo 'eval $(dircolors -b $HOME/.dircolors)' >> "$HOME"/.bashrc
117     . "$HOME"/.bashrc
118     sleep 5
119     echo "Here is LS_COLORS in action: "
120     ls -l "$HOME"/
121 EOF
122 fi
123
124 if [ ! -z "$USER2" ]
125 then
126     sudo -u "$USER2" bash <<'EOF'
127     cp "$BASHRC" "$HOME"/.bashrc
128     wget https://raw.github.com/trapd00r/LS_COLORS/master/LS_COLORS -O "$HOME"/.dircolors
129     echo 'eval $(dircolors -b $HOME/.dircolors)' >> "$HOME"/.bashrc
130     . "$HOME"/.bashrc
131     echo "Here is LS_COLORS in action: "
132     ls -l "$HOME"/
133 EOF
134 fi
135
136 if [ ! -z "$USER3" ]
137 then
138     sudo -u "$USER3" bash <<'EOF'
139     sleep 5
140     cp "$BASHRC" "$HOME"/.bashrc
141     sleep 5
142     wget https://raw.github.com/trapd00r/LS_COLORS/master/LS_COLORS -O "$HOME"/.dircolors
    sleep 5
142     wget https://raw.github.com/trapd00r/LS_COLORS/master/LS_COLORS -O "$HOME"/.dircolors
143     sleep 5
144     echo 'eval $(dircolors -b $HOME/.dircolors)' >> "$HOME"/.bashrc
145     sleep 5
146     . "$HOME"/.bashrc
147     echo "Here is LS_COLORS in action: "
148     ls -l "$HOME"/
149 EOF
150 fi
151 echo "Finished setting up LS_COLORS on your files and directories\!"

问题:

这里似乎是什么问题,什么是最佳实践和解决方案?

2 个答案:

答案 0 :(得分:2)

您正在通过sudo启动另一个bash。 BASHRC是局部变量,对子进程不可见。

由于sudo会引起另一个问题:如果/ etc / sudoers包含选项field_name = 'name' obj = MyModel.objects.first() field_value = getattr(obj, field_name) ,那么sudo会丢弃几乎所有的env变量(PATH除外)。

如果将<<'EOF'更改为<< EOF,则可以控制将在sudo之前扩展哪个变量,在sudo之后扩展哪个变量:

Defaults env_reset

答案 1 :(得分:0)

这是在姐妹网站上@steeldriver先生的评论中给出的针对此问题的答案.....:

请记住您先前的问题sudo -u用户bash可以使用,但是$HOME并没有相应地更改,我假设您希望$HOME扩展到$USER1's主目录-为此,您可能需要通过在-i调用中添加--loginsudo来调用登录Shell

所以现在看起来像这样……:

     if [ ! -z "$USER1" ]
108  then
109     sudo -i -u "$USER1" bash <<'EOF'
110     sleep 5
111     cp -f .bashrc "$HOME"/.bashrc
112     sleep 5
113     wget https://raw.github.com/trapd00r/LS_COLORS/master/LS_COLORS -O "$HOME"/.dircolors
114     sleep 5
115     echo 'eval $(dircolors -b $HOME/.dircolors)' >> "$HOME"/.bashrc
116     . "$HOME"/.bashrc
117     sleep 5
118     echo "Here is LS_COLORS in action: "
119     ls -l "$HOME"
120 EOF
121 fi

但是有一个新问题:

cp: '.bashrc' and '/home/billy/.bashrc' are the same file

此错误的原因是登录外壳程序具有/home/user1目录作为它的当前目录,而不是脚本运行所在的目录.bashrc所在的目录。

我通过在需要的地方对目录进行硬编码解决了这个问题,但是如果有人可以使用一个会引起很大关注的变量,谢谢

编辑:

我通过以下方法解决了难题的最后一个难题:

 ################# Make my variable global for all ########################3↓
 27 echo "export CURRENTDIR=\"/tmp/svaka\"" >> /root/.bashrc
 28 echo "export CURRENTDIR=\"/tmp/svaka\"" >> /etc/profile
 29 . /etc/profile

将我的变量CURRENTDIR设置为所有bash登录shell的全局变量。

在Amazon Linux上/ etc / profile上的状态:

 It's NOT a good idea to change this file unless you know what you
 are doing. It's much better to create a custom.sh shell script in
 /etc/profile.d/ to make custom changes to your environment, as this
 will prevent the need for merging in future updates.

考虑到这一点,我在bash_profile.sh中创建了一个/etc/profile.d/

别忘了可能需要注销/登录来获取更改。