CMD
произведенный ps
или имя процесса или аргументы, переданные команде (включая первый аргумент argv[0]
). Хотя это переносит некоторое отношение с путем исполняемого файла, нет никакой гарантии их, чтобы быть связанной.
На Linux:
print -r -- /proc/self/exe(:A)
На Darwin и Linux и возможно других:
lsof -ap"$$" -dtxt -Fn | sed '2!d;s/.//;q'
Но я не знаю, насколько надежный это.
Другая эвристика:
print -r -- ${${0#-}:c:A}
$0
, как Вы видят в выводе PS, содержит первый аргумент это zsh
полученный (argv[0]
), или при передаче сценарий как аргумент, тот аргумент.
В первом случае, обычно, (условно, нет никакой гарантии), это argv[0]
был бы любой путь включая a /
(относительный или абсолютный), или zsh
(что-то без /
) в этом случае вызывающая сторона будет искать zsh
в его $PATH
или его хеш-таблица команды... Если путь будет относителен, то вышеупомянутый метод будет только работать, если текущий каталог не изменился, так как zsh был вызван. Если существует нет /
, метод будет только работать если zsh
ищет исполняемый файл тот же путь, как вызывающая сторона сделала.
В случае сценария это - путь сценария, который будет возвращен вместо того из интерпретатора (вопреки первым двум решениям).
Вы не делаете то, что вы думаете, что делаете. Эта команда:
TAX="echo $salary * 0.15 | bc"
ничего не запускает, нет расчета. Это присваивает строку в переменной долл. США
. Затем, потому что вы не цитируете переменную, когда вы передаете ее на PrintF
, *
будет расширяться ко всему в текущем каталоге. Чтобы проиллюстрировать:
$ ls
file1 file2
foo="echo 12 * 4 | bc"
$ echo $foo
echo 12 file1 file2 4 | bc
, как вы можете видеть выше, *
расширился до содержимого каталога, и не было сделано расчет. Чтобы назначить результат команды на переменной, вы должны использовать var = $ (команду)
, а не цитаты.
Итак, рабочая версия вашего сценария будет:
#!/bin/sh
printf 'Please enter salary amount: '
read salary
TAX=$(printf '%s * %s\n' "$salary" "0.15" | bc)
NET=$(printf '%s + %s\n' "$salary" "$TAX" | bc)
printf "Net Salary= %.2f\n" $NET
при отладке чего-то вы всегда должны думать о печати ваших переменных, чтобы понять, что они содержат.