【发布时间】:2023-01-18 03:41:23
【问题描述】:
例如,我有一个脚本来创建网站的本地副本(哪个脚本并不重要,我以这个脚本为例)
#!/usr/bin/env bash
set -Eeuo pipefail
trap cleanup SIGINT SIGTERM ERR EXIT
VER="1.0.0"
script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P)
usage() {
cat <<EOF
Copysite v.$VER
Usage: $(basename "${BASH_SOURCE[0]}") [-h] [-v] [--verbose] -d ./Directory -u example.com
Program based on GNU Wget - designed to create a complete local copy of the site while maintaining the file structure
+---------------------------------------+
| Autor | fftcc |
| License | GNU GPL v3 |
| Website | ff99cc.art |
| E-mail | me@ff99cc.art |
| Git | codeberg.org/fftcc |
| Keyoxide | keyoxide.org/me@ff99cc.art |
+---------------------------------------+
Available options:
-h, --help Print this help and exit
-v, --version Print version
--verbose Print script debug info
-d, --dir Target directory (by default current directory if no parameter value is passed)
-u, --url Website address
EOF
exit
}
ver() {
cat <<EOF
$VER
EOF
exit
}
cleanup() {
trap - SIGINT SIGTERM ERR EXIT
}
msg() {
echo >&2 -e "${1-}"
}
wget_fn() {
wget --mirror -p --html-extension --base=./ -k -P "${dir-}" "${url-}"
}
die() {
local msg=$1
local code=${2-1} # default exit status 1
msg "$msg"
exit "$code"
}
parse_params() {
while :; do
case "${1-}" in
-h | --help) usage ;;
-v | --version) ver ;;
--verbose) set -x ;;
-d | --dir)
dir="${2-}"
shift
;;
-u | --url)
url="${2-}"
shift
;;
-?*) die "Unknown option: $1" ;;
*) break ;;
esac
shift
done
args=("$@")
# check required params and arguments
[[ -z "${url-}" ]] && die "Missing required parameter: --url"
return 0
}
parse_params "$@"
wget_fn ${dir} ${url}
帮助我编写一个脚本 install.sh,它将复制站点文件复制(或使用 curl 下载)到 /usr/bin/ 目录。但问题是并不是所有的系统都有/usr/bin/,路径可能不同,$PATH变量中就有这样的路径。但是这里还有一个问题,$PATH 中可能有多个路径。如何为系统选择一种全局安装应用程序的路径?
理论上,您可以使用常用的,例如/usr/bin/ 或/usr/local/bin/,但$PATH 中的路径可以手动或通过其他程序更改。或者比如在thermex中,从根目录到usr/bin目录的路径要经过很多文件夹 /data/data/com.termux/files/usr/bin 帮助我找到最通用的问题解决方案并编写脚本。
我在网上找到了以下解决方案:在主目录中创建一个 ~/bin 并将脚本放在那里。并通过 shell 配置文件将此目录添加到 $PATH 变量
PATH = "$HOME/bin"
但碰巧该脚本将仅对当前用户全局可执行,这不适合我。
如果有人有能力在 node js 上创建一个 cli-app 来帮助我用 js 重写我的脚本。这将通过 npm 确保跨平台兼容性,我会非常高兴。不幸的是,我没有在 commanderjs 或 oclif 上创建应用程序的经验,也没有时间从头开始学习这些工具。
【问题讨论】:
-
如果有人帮我在Node js中重写脚本并解释Node与shell命令交互的基本原理,问题将得到解决,我将能够基于此解决方案重写其余脚本。
标签: node.js linux bash npm command-line-interface