Есть несколько разных частей того, что вы, кажется, пытаетесь сделать.
Чтобы отключить
переменную, имя которой указано в другой переменной, вы можете использовать -v
, то есть
unset -v "$currentEnvVar"
для этой части. См. здесь
Чтобы присвоить переменной, вы можете использовать printf
как
printf -v "$currentEnvVar" %s 'new value'
Чтобы распечатать значение, вы можете использовать косвенную ссылку как
printf 'The value is %s\n' "${!currentEnvVar}"
В фигурных скобках если первый символ !
остальное рассматривается как имя переменной, которая содержит имя переменной, которую вы действительно хотите использовать.
Вы также можете рассмотреть возможность использования ассоциативного массива , если он вам подходит:
declare -A envVarsByName
envVarsByName[$currentEnvVar]='new value'
printf 'New val: %s\n' "${envVarsByName[$currentEnvVar]]}"
ВРЕМЕННОЕ РЕШЕНИЕ:(вероятно, часть того, что оценит спрашивающий, даже если он специально не просил об этом)
Обращайтесь к текущему каталогу практически любым способом, кроме .
. Пример:
cd
в подкаталог, а затем запустите ls
в родительском каталоге. То есть введите что-то вроде этого:
mkdir S; cd S ; /bin/ls -al..
Или обращайтесь к нему по полному пути. Пример:
ls /Volumes/microSD007
Для меня любой из этих обходных путей работает (, то есть они приводят к ожидаемому результату ), когда ls
дает мне тот же неверный результат, о котором сообщил OP. (И для меня в dmesg нет вывода, когда ls
ведет себя странно.)
Я наблюдаю те же сбои в 10.12.6 в Terminal.app, работающем под управлением bash. То же самое в csh
и sh
, даже после установки TERM на vt100. Этот обходной путь работает и в этих оболочках.
И я согласен, что в stat64
есть ошибка, как указано в ветке проблемы zsh
, на которую нам указывает Нейл. (Я думал, что проблема была вызвана неисправной и/или поддельной флэш-памятью, и до сих пор иногда думаю, не является ли это причиной.)
Я заметил, что эта ошибка также затрагивает:
ls
и ls
при использовании в режиме оболочки Emacs.