在shell脚本中创建目录/文件时权限被拒绝

时间:2015-03-04 00:13:07

标签: bash shell

我的shell脚本中有一个命令(increment.sh):

TMP_FILE=/tmp/sbg_clickstream.tmp

hive -e "select * from $HIVE_TMP_TABLE;" > $TMP_FILE

我在第二行收到错误:

/tmp/sbg_clickstream.tmp: Permission denied
Error: Error occured while opening data file
Error: Load Failed, records not inserted.
Load failed (exit code 1)

我尝试chmod 750 /tmp/sbg_clickstream.tmp并再次运行脚本,但我仍然遇到同样的错误。

我是shell脚本的新手,我认为在dir/file时创建了TMP_FILE=/tmp/sbg_clickstream.tmp。但是经过上面的测试,结论却没有。

我认为dir/file是在这一行中创建的:

hive -e "select * from $HIVE_TMP_TABLE;" > $TMP_FILE

如何在填充查询和创建文件时更改权限?

2 个答案:

答案 0 :(得分:1)

两个问题:

  • 运行脚本的用户是什么?
  • 谁拥有文件/tmp/sbg_clickstream.tmp

如果运行脚本的用户拥有该文件,则问题可能出在shell设置本身。

从命令行键入set -o,然后检查clobbernoclobber的值。如果noclobber设置为onclobber设置为off,则无法通过重定向覆盖文件。您需要设置或取消设置clobber / noclobber

如果你的shell有clobber的值(比如Kornshell),你需要这样做:

$ set -o clobber   # Turns clobber on

如果你的shell有noclobber的值(比如BASH),你需要这样做:

$ set +o noclobber # Turns noclobber off

是的,-o/+o参数似乎向后。

提示:

不要反复使用相同的文件名,请尝试以下操作:

TMP_FILE=/tmp/sbg_clickstream.$$.tmp
hive -e "select * from $HIVE_TMP_TABLE;" > $TMP_FILE

$$代表pid,因此一直在变化。系统重新启动时,应该清除/tmp目录。否则PID会攀升,不应该重复。这样,每次运行都会生成一个新的临时文件,您不必担心是否有辱骂。

更好的暗示

查看您的系统是否有mktemp命令。这将生成一个唯一的临时文件名:

TMP_FILE=$(mktemp -t sbg_clickstream.XXXXX)
echo "The tempfile is '$TMP_FILE'
hive -e "select * from $HIVE_TMP_TABLE;" > $TMP_FILE

这可能会回应这样的事情:

The tempfile is /tmp/sbg_clickstream.Ds23d

mktemp保证创建有效且唯一的临时文件名。

答案 1 :(得分:0)

chmod / chown是你的朋友,但你需要确保运行shell脚本的用户/组有权写入/ tmp目录。

以下内容的输出是什么:

ls -ld /tmp
whoami
groups