63586


※英語版においても同じ質問内容を投稿しています。

[why do cp command get error without noting add -e
option?](https://stackoverflow.com/questions/60519639/why-do-cp-command-get-
error-without-noting-add-e-option)

## 前提：実現したいこと

Dockerfileを作成し試しにbuild実行したのですが、エラーが発生しました。  
そのエラー箇所は「cp」コマンドの実行時になります。

## テストした環境

  * ベースのコンテナイメージ [centos:7](https://registry.hub.docker.com/layers/centos/library/centos/centos7/images/sha256-1f832b4e3b9ddf67fd77831cdfb591ce5e968548a01581672e5f6b32ce1212fe?context=explore)
  * MacBook Pro (Retina, 13-inch, Mid 2014)／OS: Mojabve
  * terminal 2.9.5 (421.2)

## したこと

作成したDockerfileは以下のとおりです。

[code]

    FROM centos:7
    
    ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk \
        SCALA_HOME=/usr/local/scala \
        SCALA_VERSION=scala-2.13.0
    
    WORKDIR /usr/local/lib/
    
    RUN : " *** nginx install ***" \
      && { \
            echo '[nginx-stable]'; \
            echo 'name=nginx stable repo'; \
            echo 'baseurl=http://nginx.org/packages/centos/$releasever/$basearch/'; \
            echo 'gpgcheck=1'; \
            echo 'enabled=1'; \
            echo 'gpgkey=https://nginx.org/keys/nginx_signing.key'; \
            echo 'gpgkey=https://nginx.org/keys/nginx_signing.key'; \
         } > /etc/yum.repos.d/nginx.repo \
      && yum install -y nginx \
      && cp /usr/lib/systemd/system/nginx.service /etc/systemd/system/ \
      && systemctl daemon-reload \
      && systemctl enable nginx.service \
      && systemctl start nginx \
      && nginx -version \
      && : " *** JDK install ***" \
      && JAVA_HOME=${JAVA_HOME}/bin \
      && PATH=$PATH:${JAVA_HOME}/bin \
      && java -version \
      && javac -version \
      && : "*** Scala install ***" \
      && wget http://downloads.typesafe.com/scala/2.13.0/scala-2.13.0.tgz \
      && tar zxvf scala-2.13.0.tgz \
      && ln -s ${SCALA_VERSION} scala \
      && mkdir ${SCALA_HOME} \
      && mv ${SCALA_VERSION} SCALA_HOME \
      && SCALA_HOME=${SCALA_HOME}/bin >> /etc/profile.d/scala.sh \
      && PATH=$PATH:${SCALA_HOME}/bin >> /etc/profile.d/scala.sh \
      && source /etc/profile.d/scala.sh \
      && cd \
      && scala -version \
      && : "*** sbt install ***" \
      && curl https://bintray.com/sbt/rpm/rpm | tee /etc/yum.repos.d/bintray-sbt-rpm.repo \
      && yum install -y sbt \
      && sbt -version \
      && ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
      && yum clean all \
      && mkdir -p /usr/share/app
    
    WORKDIR /usr/share/app
    
    EXPOSE 80
    
[/code]

## 発生した問題とエラー

そしてエラーの内容がこれです。

[code]

    cp: invalid option -- 'e'
    Try 'cp --help' for more information.
    
[/code]

今回のcpコマンドはオプション付けずに実行しているため  
何故エラーが発生しているのかが不明です。もちろんaliasの設定は行っていません。

どなたかお分かりになる方、ご教示いただければ幸いです。


CC BY-SA 4.0
2020-03-05T03:02:49.703
63582
2020-03-05T06:36:04.523
2020-03-05T03:56:14.513
3060
13771
question
centos docker
cp コマンドが -e オプションを使っていないのにエラーになるのは何故ですか？


タイトルにのみ反応

通常 UN*X 系 OS では shell glob 文字 `*` をシェル (bash/dash) が展開した後に各種コマンドが実行されます。

[code]

    $ cp * targetdir # は
    $ cp file1 file2 file3 file4 targetdir # として実行される
    
[/code]

そのため、次のような場合に操作員が期待していない意外な動作をすることがあります。

  * `*` にマッチしないファイルは対象外 (`.bashrc` 等ドットで始まるファイル)
  * ハイフン文字で始まるファイル名があるとコマンドラインオプションとみなされる

例 : ファイル名 `-e` また `.bashrc` があるとき

[code]

    $ ls -a
    -e  .  ..  .bashrc  abc
    $ mkdir ../backup; cp -p * ../backup; ls -a ../backup
    $ cp: unknown option -- e
    
[/code]

ハイフンで始まる文字をコマンドラインオプションと読ませないためには `--` を使うとよい (`--` の後ろはコマンドラインオプションと解釈しない仕様)
というのが GNU 業界では半ば常識になっているので

[code]

    # ../backup が無い状態でやること
    $ mkdir ../backup; cp -p -- * ../backup; ls -a ../backup
    -e  .  ..  abc  # .bashrc は複写されない！
    $ 
    
[/code]

似たような話を出しておいた例  
[1文字ハイフンが特別な意味を持つシェルコマンドの例を教えて下さい](https://ja.stackoverflow.com/questions/32124/)

ファイル１つのコピーなら `cp` で良いのですが、ディレクトリをまるごとコピーしたい場合には `cp -r` より `tar` や `cpio`
を使うほうが安全であることが多いので注意しましょう。  
[cpコマンドのaオプションとpオプションの違い](https://ja.stackoverflow.com/questions/19554/)


CC BY-SA 4.0
2020-03-05T05:18:29.777
63586
2020-03-05T06:36:04.523
2020-03-05T06:36:04.523
8589
8589
63582
answer