首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我总是在bash脚本中得到"cp: cannot‘:No这类文件或目录“或"cp:缺失操作”

为什么我总是在bash脚本中得到"cp: cannot‘:No这类文件或目录“或"cp:缺失操作”
EN

Stack Overflow用户
提问于 2018-08-18 05:49:57
回答 2查看 11.8K关注 0票数 1

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

问题:

代码语言:javascript
复制
cp "$BASHRC" "$HOME"/.bashrc

给予:

  • 数多-u比利巴什 cp:无法统计“:没有这样的文件或目录 或 cp:缺少手术人员

下面是脚本:

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

代码语言:javascript
复制
 17 BASHRC=.bashrc
 18 NANORC=.nanorc
 19 BASHRCROOT=.bashrcroot 
代码语言:javascript
复制
#!/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\!"

问题:

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-19 02:28:54

以下是sir @steeldriver在姐妹网站的评论中给出的这个问题的答案……

考虑到您以前的问题,sudo -u 用户bash工作,但是 $HOME 并没有相应地改变,我假设您希望 $HOME 扩展到 $USER1's 主目录--要实现这一点,您可能需要添加E 221 -i E 125E 226 --login E 130到您的E 231 sudo <代码>E 135/代码><调用代码>E 236来调用登录外壳。

所以现在看起来是这样.

代码语言:javascript
复制
     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

但是有一个新的问题:

代码语言:javascript
复制
cp: '.bashrc' and '/home/billy/.bashrc' are the same file

造成此错误的原因是,登录shell具有/home/user1目录,因为它是当前目录,而不是脚本运行位置的目录( .bashrc隐藏的位置)。

我通过在需要的地方硬编码目录来解决这个问题,但是如果有人有一种方法来使用一个变量,这个变量会被很大的引用,谢谢

编辑:

我通过这样做解决了谜题的最后一个问题:

代码语言:javascript
复制
 ################# 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登录-外壳的.

在Amazon /etc/profile上声明:

代码语言:javascript
复制
 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/中创建了一个/etc/profile.d/

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

票数 0
EN

Stack Overflow用户

发布于 2018-08-18 05:59:10

你正在通过sudo开始另一次狂欢。BASHRC是一个局部变量,子进程是不可见的。

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

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

代码语言:javascript
复制
#!/bin/sh
EARLY_EXPANSION=foo
export LATER_EXPANSION=bar

bash <<EOF
  echo "$EARLY_EXPANSION \$LATER_EXPANSION"
  sleep 5
  echo $(date) \$(date)
EOF
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51905689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档