【问题标题】:linux appending text gives command not foundlinux附加文本给出命令未找到
【发布时间】:2012-09-14 21:37:50
【问题描述】:

当我尝试这个简单的脚本时:

#!/bin/bash
#append csv

FILES= /home/stef/test/*

for f in $FILES do
        cat $f >> ~/test.txt done

我收到以下错误:

./append.sh: line 4: /home/stef/test/test2.txt: Permission denied.

我做错了什么?

【问题讨论】:

  • 你有/home/stef/test/test2.txt的阅读权限吗?看起来你没有。
  • 目录:drwxr-xr-x -rw-rw-rw- 文件
  • 您显然没有/home/stef/test/test2.txt 的读取权限。
  • 重要的不仅仅是目录权限,还有文件本身。

标签: linux bash


【解决方案1】:

替换

FILES= /home/stef/test/*

FILES=/home/stef/test/*

脚本正在尝试评估 /home/stef/test/* 的第一个匹配项。它说权限被拒绝,因为该文件不可执行。

./append.sh: line 4: /home/stef/test/test2.txt: Permission denied.

这是第 4 行。尝试在非空目录中使用 FOO= *

您的for ... do; done 语法也很糟糕,done 需要一个分隔符(; 或换行符),“do”也是如此。然而,这不是产生此错误消息的原因。

【讨论】:

  • @sapht 看起来像是编辑而不是作者犯的错误。另一个主要问题。
  • 不,bash 对变量赋值中的空格很挑剔,这导致了这个问题。
  • @sehe 我的测试表明它忽略了变量分配并尝试评估扩展的通配符。在带有文件“bar”的目录中,它会尝试从 bin 路径执行“bar”。我从未在生产代码中看到 = 之后的空格,并将其视为语法缺陷。
  • @sapht 感谢您提供理由。 +1
  • @sapht:您可以在简单命令前加上变量赋值,以影响对命令环境的更改。 FOO= cmd 只需运行 cmd 并将 FOO 设置为其环境中的空字符串;当前环境中的FOO 保持不变。
【解决方案2】:

您需要在您的代码中进行此更改:

#!/bin/bash
#append csv

FILES=/some_path/*

for f in $FILES
do
        cat $f >> ~/test.txt
done

不要忘记删除 FILE 行中路径前的空白,

【讨论】:

    【解决方案3】:

    缺少语句分隔符:像这样修复它

    for f in $FILES do
            cat $f >> ~/test.txt 
    done
    

    或者

    for f in $FILES do
            cat $f >> ~/test.txt; done
    

    【讨论】:

      【解决方案4】:

      请注意,如果您的任何文件名有空格,您就会遇到问题。当您使用for 遍历一个变量时,您将遍历该变量中以空格分隔的words。为了安全地遍历文件,无论名称中是否包含空格,都不要将文件列表存储在普通变量中。

      最直接的方式:

      for f in /home/stef/test/*; do
        # ...
      

      如果要将文件名保存在某种容器中,则需要使用数组:

      files=( /home/stef/test/* )
      for f in "${files[@]}"; do
        # ...
      

      【讨论】:

        猜你喜欢
        • 2018-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-11
        • 1970-01-01
        • 1970-01-01
        • 2017-04-25
        • 1970-01-01
        相关资源
        最近更新 更多