【问题标题】:Using a variable to define a path使用变量定义路径
【发布时间】:2013-05-15 10:02:30
【问题描述】:
#!/bin/bash
SOURCE="/C/MSDFFiles/IPFiles/Source"

WORKING="/C/MSDFiles/IPFiles/Working"

rm -rf ./Working/*

cp "$SOURCE/"* "$WORKING/" 2> /dev/null

echo "DONE"

我正在尝试将所有文​​件从源复制到工作但它不工作,我的输出完成但文件没有被转移到工作文件夹

【问题讨论】:

  • 使用2> /dev/null 隐藏错误不会帮助您找到它不起作用的原因:) 尝试删除2> /dev/null
  • 即使我删除 2 也能正常工作> /dev/null
  • @Aparna $SOURCE$WORKING 存在吗?有什么理由使用绝对相对路径?
  • 如果我删除 2> /dev/null 部分代码,我将得到 cp: target `\r' is not a directory
  • @htor 它们存在,工作文件夹可能会更改其位置,这就是为什么我希望将路径声明为变量,然后将它们移动到属性文件

标签: bash path cygwin


【解决方案1】:

您的问题很可能是your script's line endings being currupted by Windows 的结果。 Linux 换行符总是\n(一个换行符),但在Windows 中是\r\n(一个回车符后跟一个换行符)。

在这里,您可能在路径声明之后有一个回车符。 从脚本中删除回车符,它应该可以解决问题。

如果您使用vim,您可以使用:set list 命令查看文件中的所有不可打印字符。

【讨论】:

  • 我不认为这是马车问题的问题,而不是变量,如果我直接给定文件夹名称文件正在使用相同的脚本传输
  • @Aparna 你“认为”?你真的检查过吗?
  • 我确实检查过它似乎可以使用文件夹名称而不是变量来正常工作
  • 变量将具有以它们的值结尾的行中的\r;行中间的硬编码字符串不会。
【解决方案2】:

从错误信息来看

cp: 目标 `\r' 不是目录

您的脚本中的换行符似乎有问题(\rCarriage Return)。您是否在 Windows 上编辑过文件?

您应该能够使用类似的东西删除这些字符

recode ibmpc..latin1 script.sh

mv script.sh script.tmp
cat script.tmp | tr -d '\r' > script.sh
rm script.tmp

sed -i "s/\r//g" script.sh

【讨论】:

  • 是的,如果我添加 2> /dev/null 文件似乎运行良好,但 cp 操作没有按预期工作
  • @Aparna 我不明白你的评论与 Ansgar 给你的答案有什么关系?
  • 删除 CR 字符后,如果 cp 仍然失败,您应该会收到不同的错误。
  • @Aparna 你误解了2>/dev/null 的作用。同样,该重定向只是抑制错误 message。错误本身仍然存在。
  • @AnsgarWiechers - 非常感谢您的快速回复,我的脚本现在按预期工作,谢谢您的语气:-)
猜你喜欢
  • 2016-03-04
  • 2012-02-15
  • 2013-06-30
  • 2019-05-26
  • 2017-09-08
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多