С zsh
:
newname=${${fname//:pear:}:-nullfile}
С bash
или ksh93
, вы должны сделать это в два этапа:
newname=${fname//:pear:}
newname=${newname:-nullfile}
Согласно POSIX, чтобы удалить все вхождения строки, вы должны сделать это так:
newname=$(
printf '%s\n' "$fname" | sed 's/:pear://g'; echo .
)
newname=${newname%??}
newname=${newname:-nullfile}
Вы можете упростить это до:
newname=$(
printf '%s\n' "$fname" | sed 's/:pear://g'
)
newname=${newname:-nullfile}
Если вы можете гарантировать, что $fname
не заканчивается символами новой строки.
<(...)
— это синтаксис ksh, также распознаваемый zsh
и bash
, хотя при использовании в качестве цели перенаправления он поддерживается только zsh
и bash
.
В любом случае, это не sh
синтаксис. Python os.system()
и os.popen()
запускают sh
для интерпретации данной командной строки. И каждый вызов этих команд запускает новую оболочку, поэтому одна переменная, определенная в одной, не будет доступна при следующем вызове оболочки. Также python
переменные не становятся переменными оболочки автоматически.
Здесь можно сделать:
os.system("""
sar -u 1 1 |
awk -v t="$(date +%m-%d-%y-%T)" -v OFS=, '
NR==4 {
print t, $4, $5, $6, $7, $8, $9
}' > outputfile.txt""")
Хотя выглядит глупо вызывать date
иawk
(или даже оболочку )изнутри python
, в то время как python
вполне способен сам выполнять свою работу.