【问题标题】:Running shell scripts with special chars in unix在 unix 中运行带有特殊字符的 shell 脚本
【发布时间】:2018-10-09 15:39:33
【问题描述】:

我的 shell 脚本遇到了繁琐的问题。它将文件从另一台服务器复制到它的服务器。麻烦就在这里:

要复制的文件的名称中有一个特殊的字符,例如:“CDACampaña”。但是当我使用 vi 命令打开我的文件时,它看起来像 CDACampaña.txt (使用 cat 命令时它看起来正确),并且当我运行日志显示我的文件在 CDACampa 之后没有更多...

我的文件代码示例(这不是功能性的,只是为了理解)

#Local machine
blabla code
cp //remote/CDACampaña.txt localfolder
bleble code

#Unix server vi command
blabla code
cp //remote/CDACampaña.txt localfolder
bleble code

#Unix log
blabla code
cp //remote/CDACampa

我尝试将我的 shell 上传为 UTF8、UTF8 WO BOOM、ANSI,并使用 UNIX 或 WINDOWS eol,但没有任何效果。

请问有什么办法吗?

已编辑:

Unix 语言环境:

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

本地PC编码:

IsSingleByte      : True
BodyName          : iso-8859-1
EncodingName      : Europeo occidental (Windows)
HeaderName        : Windows-1252
WebName           : Windows-1252
WindowsCodePage   : 1252
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
EncoderFallback   : System.Text.InternalEncoderBestFitFallback
DecoderFallback   : System.Text.InternalDecoderBestFitFallback
IsReadOnly        : True
CodePage          : 1252

【问题讨论】:

  • 您未能为 UTF-8 配置 vi
  • 这实际上很不清楚,但字符串显然是 UTF-8,在某些遗留的 8 位字符集中查看。如果没有有关所涉及的实际编码和/或文件名中的实际字节的信息,我们只能推测。请edit您的问题包括相关详细信息;请参阅Stack Overflow character-encoding tag info page 中的指南。您的locale 设置是什么?您在远程服务器上观察到什么行为,以及在本地观察到什么?
  • 在 CP1252 终端中打印 UTF-8 字符...嗯,是的,这会导致您的问题(就输出的打印方式而言,脚本本身没有任何问题)。使用更好的终端程序怎么样?
  • ...顺便说一句,我仍在等待LC_ALL=C; printf '%q\n' *.txt 输出以明确(不依赖于区域设置)的形式显示本地和远程名称。这会让我们知道这些名字是否安全通过,只是显示错误,或者实际上被篡改了。

标签: bash shell unix utf-8 char


【解决方案1】:

您可以在设置 LC_ALL=C 后使用 printf '%q\n' CDACamp*.txt 来查看您的文件名将如何以 7 位干净的 ASCII 字符集呈现(因此,它几乎可以在任何终端上正确呈现)。

如果输出是:

$'/cert/bcp/xcom/emic/CDACampa\361a.txt'

...这是您可以在脚本中输入的值(只要它使用#!/bin/bash#!/usr/bin/env bash 运行, #!/bin/sh):

cp $'/cert/bcp/xcom/emic/CDACampa\361a.txt' localfolder

因为涉及的所有字符都是 7 位纯字符,所以无论您的终端是否正确支持 Unicode(或扩展 ASCII),它们看起来都是一样的。

【讨论】:

  • 非常感谢,非常感谢。
猜你喜欢
  • 2015-11-01
  • 2018-07-07
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
相关资源
最近更新 更多