awk 命令访问和覆盖文件在 shell 中有效,但在脚本中使用时会抛出错误
awk command accessing and overwriting file works in shell, but throws error when used in script
以下代码形成一个字符串(导入语句),用awk从handler.js中读取内容,在匹配的上下文“shell添加导入”后追加文本,然后覆盖文件。
#!/bin/zsh
# setting path for project folders
HANDLER_PATH=${pwd}"workers/model/"
# just an import statement - being used as string
local IMPORT_TEXT=(import ${MAIN_FUNCTION} from "'./model/${MODEL_NAME}/${MODEL_NAME}'")
awk -v text=${IMPORT_TEXT} '1;/shell added import/{print text}' ${HANDLER_PATH}handler.js > ${HANDLER_PATH}handler.js_tmp && mv ${HANDLER_PATH}handler.js_tmp ${HANDLER_PATH}handler.js
相反,它抛出错误[无法读取文件]
请注意,它适用于 shell,但不适用于 script.sh。此外,此类似代码适用于其他文件以及脚本。添加相同的权限:
Other file: -rw-r--r-- 1 user staff 9384
handler.js: -rw-r--r-- 1 user staff 7453
根据我提到的其他线程,“如果它在终端而不是脚本中运行,则存在一些权限问题”
感谢任何帮助!
听起来这就是你真正想要做的(未经测试):
#!/usr/bin/env bash
# setting path for project folders
handler_path="$PWD/workers/model"
hdlr="$handler_path/handler.js"
tmp="${hdlr}_tmp"
# just an import statement - being used as string
import_text="import $MAIN_FUNCTION from \"'./model/$MODEL_NAME/$MODEL_NAME'\""
awk -v text="$import_text" '
{ print }
/shell added import/ { print text }
' "$hdlr" > "$tmp" &&
mv -- "$tmp" "$hdlr"
如果您愿意,我希望它也能在 zsh 中正常工作 shell。
出了什么问题?
IMPORT_TEXT=(import ${MAIN_FUNCTION} from "'./model/${MODEL_NAME}/${MODEL_NAME}'")
... 定义了一个包含多个条目的数组。 Bash 和 zsh 都支持数组,但方式不同。在 bash 中,像普通变量一样使用数组检索第一个条目(在本例中为 import
)。在 zsh 中,像普通变量一样使用数组会检索所有值作为单独的参数。
示例:
$ bash -c 'a=(1 2 "a b" "*"); printf :%s:\n $a'
:1:
$ zsh -c 'a=(1 2 "a b" "*"); printf :%s:\n $a'
:1:
:2:
:a b:
:*:
您的终端似乎使用了 bash,导致命令
awk -v text=import '1;…' …
但是当你直接 运行 脚本时,shebang #!/bin/zsh
导致它在 zsh 中 运行,导致命令
awk -v text=import "${MAIN_FUNCTION}" from "'./model/${MODEL_NAME}/${MODEL_NAME}'" '1;/…' …
因此,awk
将 ${MAIN_FUNCTION}
解释为 运行 的脚本,并将其后的所有内容解释为文件。由于您的系统上没有名为 from
的文件,因此 awk
抛出了错误。
如何解决?
见
以下代码形成一个字符串(导入语句),用awk从handler.js中读取内容,在匹配的上下文“shell添加导入”后追加文本,然后覆盖文件。
#!/bin/zsh
# setting path for project folders
HANDLER_PATH=${pwd}"workers/model/"
# just an import statement - being used as string
local IMPORT_TEXT=(import ${MAIN_FUNCTION} from "'./model/${MODEL_NAME}/${MODEL_NAME}'")
awk -v text=${IMPORT_TEXT} '1;/shell added import/{print text}' ${HANDLER_PATH}handler.js > ${HANDLER_PATH}handler.js_tmp && mv ${HANDLER_PATH}handler.js_tmp ${HANDLER_PATH}handler.js
相反,它抛出错误[无法读取文件]
请注意,它适用于 shell,但不适用于 script.sh。此外,此类似代码适用于其他文件以及脚本。添加相同的权限:
Other file: -rw-r--r-- 1 user staff 9384
handler.js: -rw-r--r-- 1 user staff 7453
根据我提到的其他线程,“如果它在终端而不是脚本中运行,则存在一些权限问题”
感谢任何帮助!
听起来这就是你真正想要做的(未经测试):
#!/usr/bin/env bash
# setting path for project folders
handler_path="$PWD/workers/model"
hdlr="$handler_path/handler.js"
tmp="${hdlr}_tmp"
# just an import statement - being used as string
import_text="import $MAIN_FUNCTION from \"'./model/$MODEL_NAME/$MODEL_NAME'\""
awk -v text="$import_text" '
{ print }
/shell added import/ { print text }
' "$hdlr" > "$tmp" &&
mv -- "$tmp" "$hdlr"
如果您愿意,我希望它也能在 zsh 中正常工作 shell。
出了什么问题?
IMPORT_TEXT=(import ${MAIN_FUNCTION} from "'./model/${MODEL_NAME}/${MODEL_NAME}'")
... 定义了一个包含多个条目的数组。 Bash 和 zsh 都支持数组,但方式不同。在 bash 中,像普通变量一样使用数组检索第一个条目(在本例中为 import
)。在 zsh 中,像普通变量一样使用数组会检索所有值作为单独的参数。
示例:
$ bash -c 'a=(1 2 "a b" "*"); printf :%s:\n $a'
:1:
$ zsh -c 'a=(1 2 "a b" "*"); printf :%s:\n $a'
:1:
:2:
:a b:
:*:
您的终端似乎使用了 bash,导致命令
awk -v text=import '1;…' …
但是当你直接 运行 脚本时,shebang #!/bin/zsh
导致它在 zsh 中 运行,导致命令
awk -v text=import "${MAIN_FUNCTION}" from "'./model/${MODEL_NAME}/${MODEL_NAME}'" '1;/…' …
因此,awk
将 ${MAIN_FUNCTION}
解释为 运行 的脚本,并将其后的所有内容解释为文件。由于您的系统上没有名为 from
的文件,因此 awk
抛出了错误。
如何解决?
见