【问题标题】:How to use the install command with a heredoc如何使用带有 heredoc 的 install 命令
【发布时间】:2016-06-12 22:25:02
【问题描述】:

我正在尝试将安装脚本转换为使用install 命令,而不是创建一个文件并针对它运行chmod +x。这是现在的脚本:

#!/usr/bin/env bash

install_target=/usr/local/bin/my_prog
volatile_path=/this/path/could/change

cat << EOF > "$install_target"
#!/usr/bin/env bash

"$volatile_path/some_other_executable" "\$@"
EOF
chmod +x "$install_target"

我更愿意做的是:

#!/usr/bin/env bash

install_target=/usr/local/bin/my_prog
volatile_path=/this/path/could/change

install "$install_target" << EOF 
#!/usr/bin/env bash

"$volatile_path/some_other_executable" "\$@"
EOF

我缺少什么来完成这项工作?

【问题讨论】:

  • install 对标准输入有何期望?它是文本文件的内容吗?快速浏览一下install --help 可能会给你一个想法。
  • 我希望我的用户可以使用的安装版本只是提供了来自--help 的文字用法,没有解释。但是,手册页提供了更多解释,并且似乎要求提供文件名,而不是文件内容,因此我怀疑您帮助我回答了我自己的问题。

标签: bash shell heredoc


【解决方案1】:

基于 cmets,并假设您使用的是 BSD 版本的安装(GNU install 具有由 install --help 显示的完整帮助,而 BSD 仅显示基本用法)我认为这就是您想要做的:

#!/usr/bin/env bash

install_target=/usr/local/bin/my_prog
volatile_path=/this/path/could/change
temp_file=/tmp/$0.$$.$RANDOM

cat << EOF > "$temp_file"
#!/usr/bin/env bash

"$volatile_path/some_other_executable" "\$@"
EOF

install -bd "$temp_file" "$install_target"
rm -f "$temp_file"

未经测试,但使用process substitution 应该不需要临时文件:

#!/usr/bin/env bash

install_target=/usr/local/bin/my_prog
volatile_path=/this/path/could/change

install -bd <(cat << EOF
#!/usr/bin/env bash

"$volatile_path/some_other_executable" "\$@"
EOF
) "$install_target"

【讨论】:

  • 是的,你打败了我:+1:
  • 我的偏好是使用install 创建一个具有所需名称和权限的空文件,然后回显到它(而不是弄乱临时文件)。不幸的是,这仍然没有达到一步完成的最终目标。
  • @PaulGalbraith 在过去的 5 年里我学到了很多东西。不需要临时文件!
  • 在您的 heredocs 中,"$volatile_path/some_other_executable" "\$@" 将呈现为 "/some_other_executable" "$@"。将" 放在heredoc 关键字周围可防止bash 扩展这些关键字并允许"\$@" 失去转义。
  • 但是$volatile_path 没有展开。而cat 也不是没用,它正在将文本发送到 fd 文件中。
猜你喜欢
  • 2020-08-21
  • 2017-03-22
  • 2018-09-13
  • 2015-01-16
  • 1970-01-01
  • 2016-12-30
  • 2012-10-31
  • 1970-01-01
相关资源
最近更新 更多