【问题标题】:Why do I keep getting "cp: cannot stat '': No such file or directory" or "cp: missing opereand" in my bash script为什么我的 bash 脚本中不断出现“cp: cannot stat '': No such file or directory”或“cp: missing opereand”
【发布时间】:2019-01-25 02:30:22
【问题描述】:

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

问题:

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

给予:

+ sudo -u 比利巴什

cp: cannot stat '': 没有这样的文件或目录

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\!"

问题:

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

【问题讨论】:

    标签: linux bash shell variables directory


    【解决方案1】:

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

    由于 sudo 会出现另一个问题:如果 /etc/sudoers 包含选项 Defaults env_reset,那么 sudo 将丢弃几乎所有 env 变量(PATH 除外)。

    如果把

    #!/bin/sh
    EARLY_EXPANSION=foo
    export LATER_EXPANSION=bar
    
    bash <<EOF
      echo "$EARLY_EXPANSION \$LATER_EXPANSION"
      sleep 5
      echo $(date) \$(date)
    EOF
    

    【讨论】:

    • 感谢您提供的信息/答案,它帮助我了解更多信息,但我无法更改 EOF,因为其他事情将无法运行,您能否给我一个示例,由谁来制作 $HOME 和脚本可见的其他人
    • 为什么 cp 在这个 sn-p 中起作用,如果像你说它是 sudo's faultsudo -u "$ROOT" bash &lt;&lt;'EOF' 86 cp "$BASHRCROOT" "$HOME"/.bashrc 87 wget https://raw.github.com/trapd00r/LS_COLORS/master/LS_COLORS -O "$HOME"/.dircolors 88 echo 'eval $(dircolors -b $HOME/.dircolors)' &gt;&gt; "$HOME"/.bashrc 89 . "$HOME"/.bashrc
    • 可能是因为if [ "$UID" != 0 ]这个sn-p没有执行?
    • 扩展答案
    【解决方案2】:

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

    记住您​​之前的问题 sudo -u 用户 bash 有效,但 $HOME 没有相应改变通过在 sudo 调用中添加 -i--login 来调用登录 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
    

    此错误的原因是登录 shell 将 /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.
    

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

    不要忘记可能需要注销/登录才能获取更改。

    【讨论】:

    • 我很高兴它有帮助,但这个答案是针对另一个问题,而不是被问到的那个......
    猜你喜欢
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2020-01-31
    • 2020-03-19
    • 2021-11-16
    • 1970-01-01
    • 2012-05-30
    • 2023-04-03
    相关资源
    最近更新 更多