【问题标题】:bad character showing up in bash script executionbash 脚本执行中出现的坏字符
【发布时间】:2023-03-27 03:36:01
【问题描述】:

我有一个 bash 脚本,它在某些字符串上附加了一个重音字符,导致它失败,我找不到这些字符在哪里或如何进入那里。

这是一些示例输出:

mv: cannot move â/tmp/myapp.zipâ to â/opt/myserver/myapp/deploys/myapp.1.2.21.zipâ: No such file or directory
ln: failed to create symbolic link â/opt/myserver/myapp/deploys/myapp_beta.zipâ: No such file or directory
cp: cannot stat â/opt/myserver/myapp/deploys/myapp_beta.zipâ: No such file or directory

无效字符是

脚本如下:

#!/bin/bash

BRANCH=$1

SVN_LOC="https://svn/svn/myserver/"

MYAPP_REPO="myapp.git"
COREJS_REPO="core-js.git"
SPARTAN_REPO="core-spartan.git"

MYAPP_LOCATION="myapp/"
COREJS_LOCATION="corejs/"
SPARTAN_LOCATION="spartan/"

DEPLOY_LOCATION="/tmp/deploy/"
CLEANUP="${DEPLOY_LOCATION}*"

DEPLOY_STORE="/opt/myserver/myapp/deploys/"

DEPLOY_TIME=$(date +%s)

failed ()
{
    rm -rf $CLEANUP
    exit 1
}

mkdir -p $DEPLOY_LOCATION

echo "Retrieving Code from Git Branch ${BRANCH}"

echo "Retrieving myapp code"

mkdir -p "${DEPLOY_LOCATION}${MYAPP_LOCATION}"
pushd /opt/myserver/myapp/myapp
git archive $BRANCH | tar -x -C "${DEPLOY_LOCATION}${MYAPP_LOCATION}"
if [ $? -ne 0 ]
then
    echo "Failed retrieving code from git ${MYAPP_REPO} repo";
    failed
fi
popd

echo "Checking version numbers"
VERSION=$(php "${DEPLOY_LOCATION}${MYAPP_LOCATION}version.php" output)

DEPLOY_PACKAGE="${DEPLOY_STORE}myapp.${VERSION}.zip"

if [ -f $DEPLOY_PACKAGE ]
then
    echo "A deploy with the same version number (${VERSION}) already exists! Please increment version number or manually deal with existing ${DEPLOY_PACKAGE}";
    failed
fi

echo "Retrieving corejs code"

mkdir -p "${DEPLOY_LOCATION}${COREJS_LOCATION}"
pushd /opt/myserver/myapp/core-js
git archive $BRANCH | tar -x -C "${DEPLOY_LOCATION}${COREJS_LOCATION}"
if [ $? -ne 0 ]
then
    echo "Failed retrieving code from git ${COREJS_REPO} repo";
    failed
fi
popd

echo "Retrieving spartan code"

mkdir -p "${DEPLOY_LOCATION}${SPARTAN_LOCATION}"
pushd /opt/myserver/myapp/spartan
git archive $BRANCH | tar -x -C "${DEPLOY_LOCATION}${SPARTAN_LOCATION}"
if [ $? -ne 0 ]
then
    echo "Failed retrieving code from git ${SPARTAN_REPO} repo";
    failed
fi
popd

echo "Minifying js and css"

pushd "${DEPLOY_LOCATION}${MYAPP_LOCATION}Server/Deploy/"
php MinifyLyroke.php --deploytime $DEPLOY_TIME
popd

ASSETS_DEPLOY_PACKAGE="${DEPLOY_STORE}myappassets.${VERSION}.zip"
TEMP_ASSETS_ZIP_LOC="/tmp/myappassets.zip"
DEPLOY_ASSETS="${DEPLOY_LOCATION}myapp/Assets/"
ASSETS_DEPLOY_LOCATION="/tmp/assetsdeploy/"
DEPLOYED_ASSETS="${ASSETS_DEPLOY_LOCATION}myappassets_${DEPLOY_TIME}"

mkdir -p $ASSETS_DEPLOY_LOCATION

echo "Packaging assets deploy to ${ASSETS_DEPLOY_PACKAGE}"

mv $DEPLOY_ASSETS $DEPLOYED_ASSETS

pushd $ASSETS_DEPLOY_LOCATION
zip -r ${TEMP_ASSETS_ZIP_LOC} *
popd

mv ${TEMP_ASSETS_ZIP_LOC} ${ASSETS_DEPLOY_PACKAGE}
ln -sfn ${ASSETS_DEPLOY_PACKAGE} "${DEPLOY_STORE}myappassets_beta.zip"
cp "${DEPLOY_STORE}myappassets_beta.zip" "/opt/myserver/myapp/myapp/Server/Deploy/"

rm -rf $DEPLOYED_ASSETS
rm -rf $ASSETS_DEPLOY_LOCATION

echo "Packaging deploy to ${DEPLOY_PACKAGE}"

TEMP_ZIP_LOC="/tmp/myapp.zip"

pushd ${DEPLOY_LOCATION}
zip -r ${TEMP_ZIP_LOC} *
popd

mv "${TEMP_ZIP_LOC}" "${DEPLOY_PACKAGE}"
ln -sfn "${DEPLOY_PACKAGE}" "${DEPLOY_STORE}myapp_beta.zip"
cp "${DEPLOY_STORE}myapp_beta.zip" "/opt/myserver/myapp/myapp/Server/Deploy"

echo "Cleaning up"

rm -rf $CLEANUP

任何人都可以看到问题或建议我可以找到问题所在的方法吗?

【问题讨论】:

  • 检查您的脚本中是否有 quote 字符。看起来你可能有不受欢迎的字符而不是 "
  • 尝试调试你的脚本bash -x ...
  • 顺便说一句,您应该始终使用#!/bin/bash -e,尤其是对于可能具有危险影响的脚本。您不希望出现objpath=`get_path ...` 失败并随后导致您rm -rf /usr/$objpath(或其他同样愚蠢的东西)的情况。

标签: bash shell ubuntu


【解决方案1】:

那些â 字符只是从您的外壳打印出来的错位的智能引号。您的 shell 可能正在输出 UTF-8,但您的终端正在读取 ISO-8859-1。请注意,â 是 ISO-8859-1 中 UTF-8 编码的智能引号 的呈现,在 â 后面有两个不可打印字符。大多数现代终端仿真器都带有启用 UTF-8 的选项;看看你是否可以启用它(它会让你的生活更轻松)。

问题在于你的剧本,而不是有趣的角色。

【讨论】:

  • 谢谢你,我怀疑它很像这样。我没有任何运气找到有问题的字符,可能只需要从头开始重写
  • no 个违规字符。这就是我要指出的。您的脚本可能使用了错误的路径之类的。
  • 哦,好吧,这是有道理的,它是在一个阶段解析路径,但并非所有已“感染”的字符串都是以这种方式产生的,有些只是在脚本本身中编码,但我遵循这一思路并看看我发现了什么
  • @Tristan:我认为您没有仔细阅读我的回答。您的字符串没有“感染”;在您的脚本或字符串中没有奇怪的字符。只是终端上的编码设置不正确。尝试确保您使用的路径确实存在。
  • 不会影响任何事情。你的脚本在某种程度上是错误的。 仔细检查您正在使用的路径。其中一个或多个可能不存在。要解决“有趣的字符”,请正确设置终端编码。
【解决方案2】:

尝试在 Notepad++ 等其他文本编辑器中打开脚本,看看是否存在任何特殊字符。

【讨论】:

  • 感谢您的建议,但我已经这样做了,但仍然找不到问题
【解决方案3】:

从命令行键入这两个命令。您期望存在的一个或多个文件/目录不存在。

ls /tmp/myapp.zip
ls /opt/myserver/myapp/deploys

【讨论】:

    【解决方案4】:

    接受的答案解释了问题,感谢@nneonneo。这是您可以做的快速修复:

    A) 检查您的区域设置:

      locale
    

    B) 在调用您的脚本之前或在您的 bash 脚本顶部尝试:

      export LANG=en_US.UTF-8
      export LC_ALL=C
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 2016-07-11
      • 2015-03-02
      • 1970-01-01
      相关资源
      最近更新 更多