انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => نصب، راه‌اندازی و بروزآوری => نویسنده: nino در 25 خرداد 1397، 04:47 ب‌ظ

عنوان: خطای syntax error در ترمینال
ارسال شده توسط: nino در 25 خرداد 1397، 04:47 ب‌ظ
سلام. چند روزی میشه که با باز کردن ترمینال، یک پیغام در ابتدای اون نشون داده میشه با این مضمون (عکسش رو هم پیوست کردم):
bash: /usr/share/bash-completion/bash_completion: line 171: syntax error near unexpected token `}'
bash: /usr/share/bash-completion/bash_completion: line 171: `}'

اون خط ۱۷۱ که در پیغام بهش اشاره شده، خط آخر این بخش از محتویات فایل bash_completion هست:
_upvar()
{
    if unset -v "$1"; then           # Unset & validate varname
        if (( $# == 2 )); then
            eval $1=\"\$2\"          # Return single value
        else
            eval $1=\(\"\${@:2}\"\)  # Return array
        fi
    fi
}

برای رفعش چکار باید کرد؟
آیا باید تغییراتی در خط ۱۷۱ بدم؟
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: علی رزم دیده در 25 خرداد 1397، 05:18 ب‌ظ
با سلام
این بلوک ظاهراً مشکلی نداره ، شاید یه { از قسمت های بالاتر پاک شده باشه و تقارن پرانتزها به هم خورده باشه. شما خروجی دستور زیر رو کامل بذارین تا دقیق تر بررسیش کنیم :
cat /usr/share/bash-completion/bash_completion
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: مهران تعریف در 25 خرداد 1397، 06:04 ب‌ظ
خیلی سرمگرم کننده اس برام که وقتی این مشکلات پیش میاد، اون قدر بگردم تا مشکل رو پیدا کنم، اما دنبال راه حل باشی، بسته ی bash-completion رو ری ایسنتال کن.
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: nino در 25 خرداد 1397، 06:08 ب‌ظ
خیلی سرمگرم کننده اس برام که وقتی این مشکلات پیش میاد، اون قدر بگردم تا مشکل رو پیدا کنم، اما دنبال راه حل باشی، بسته ی bash-completion رو ری ایسنتال کن.

دوباره نصب کردم اما درست نشد.
حتی توی یکی از انجمن ها هم نوشته بود که باید یه کاراکتری اضافه (یا حذف) بشه اما کاربران دیگه در زیر اون گفته بودن که این کار بهتره انجام نشه. یادم نیست نوشته بودن ممکنه این کار مشکل ایجاد کنه یا این که این راه حل دائمی نیست و دوباره با ری استارت به همون وضعیت قبل بر می گرده. به هر حال از اون کار منصرف شدم.
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: nino در 25 خرداد 1397، 06:13 ب‌ظ
با سلام
این بلوک ظاهراً مشکلی نداره ، شاید یه { از قسمت های بالاتر پاک شده باشه و تقارن پرانتزها به هم خورده باشه. شما خروجی دستور زیر رو کامل بذارین تا دقیق تر بررسیش کنیم :
cat /usr/share/bash-completion/bash_completion

متاسفانه هر چی سعی می کنم متن رو آپلود کنم انجمن ارور میده: دوباره تلاش کنید!
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: علی رزم دیده در 25 خرداد 1397، 06:17 ب‌ظ
دوباره نصب کردم اما درست نشد.
حتی توی یکی از انجمن ها هم نوشته بود که باید یه کاراکتری اضافه (یا حذف) بشه اما کاربران دیگه در زیر اون گفته بودن که این کار بهتره انجام نشه. یادم نیست نوشته بودن ممکنه این کار مشکل ایجاد کنه یا این که این راه حل دائمی نیست و دوباره با ری استارت به همون وضعیت قبل بر می گرده. به هر حال از اون کار منصرف شدم.
دوست عزیز شما خروجی دستوری رو که دادم ، رو بذارین تا ما بررسی کنیم چون توی این جور مواقع قرار نیست راه حلی که به دیگران پیشنهاد دادن برای شما هم کارساز باشه.


پ.ن: نصب دوباره به تنهایی بدرد نمی خوره چون اگه فایلی به اسم bash-completion وجود داشته باشه ، apt هیچ وقت اون رو بازنویسی نمی کنه.
اگه می خواین با متدی که مهران جان گفتن مشکلتون رو حل کنین اول باید فایل رو از دسترس خارج کنین بعدش ری ایسنتال کنین :
sudo mv /usr/share/bash-completion/bash_completion /usr/share/bash-completion/bash_completion.bak
sudo apt install --reinstall bash-completion
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: علی رزم دیده در 25 خرداد 1397، 06:18 ب‌ظ
متاسفانه هر چی سعی می کنم متن رو آپلود کنم انجمن ارور میده: دوباره تلاش کنید!
می تونین از سرویس pastebin استفاده کنین. شاید محدودیت کارکتر برای ارسال ها گذاشته شده باشه. البته قبل از ارسال ، متد ری اینستال رو هم تست کنین
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: nino در 25 خرداد 1397، 06:24 ب‌ظ
می تونین از سرویس pastebin استفاده کنین. شاید محدودیت کارکتر برای ارسال ها گذاشته شده باشه.
بله ظاهرا به خاطر محدودیت کاراکتره: https://paste.ubuntu.ir/jrcy

البته قبل از ارسال ، متد ری اینستال رو هم تست کنین
توزیع من آرچه. فایل bash_completion رو حذف کردم و برنامه رو با این دستور دوباره نصب کردم (ظاهرا اگر برنامه ای از قبل وجود داشته باشه، پکمن اون رو از اول reinstall می کنه):
sudo pacman -S bash-completion
اما همچنان مشکل پابرجاست.
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: علی رزم دیده در 25 خرداد 1397، 06:43 ب‌ظ
عجیبه من تست کردم فایل مشکلی نداشت !

این فایل رو بعد reinstall گذاشتین ؟ یا همون قبلیه هستش ؟

من این محتویات رو توی یک فایل به اسم src ریختم و دستور زیر رو زدم و هیچ خطایی نداد :
source src
شما دستور زیر رو وارد کنین و خروجی رو بذارین :
source /usr/share/bash-completion/bash_completion
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: علی رزم دیده در 25 خرداد 1397، 06:48 ب‌ظ
توزیع من آرچه. فایل bash_completion رو حذف کردم و برنامه رو با این دستور دوباره نصب کردم (ظاهرا اگر برنامه ای از قبل وجود داشته باشه، پکمن اون رو از اول reinstall می کنه):
sudo pacman -S bash-completion
اما همچنان مشکل پابرجاست.

بله ظاهراً مشکل اصن از اون فایل نیستش شاید باید جای دیگه ای دنبال مشکل گشت برای این قضیه خروجی این دستورات رو هم بذارین :
cat .profile
cat .bashrc
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: nino در 25 خرداد 1397، 06:51 ب‌ظ
عجیبه من تست کردم فایل مشکلی نداشت !

این فایل رو بعد reinstall گذاشتین ؟ یا همون قبلیه هستش ؟

من این محتویات رو توی یک فایل به اسم src ریختم و دستور زیر رو زدم و هیچ خطایی نداد :
source src
متنی که بالاتر لینکش رو گذاشتم برای قبل از reinstall هست.
اینم لینک متن فایل بعد از reinstall هست: https://paste.ubuntu.ir/aktd

شما دستور زیر رو وارد کنین و خروجی رو بذارین :
source /usr/share/bash-completion/bash_completion
خروجی:
bash: /usr/share/bash-completion/bash_completion: line 171: syntax error near unexpected token `}'
bash: /usr/share/bash-completion/bash_completion: line 171: `}'
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: nino در 25 خرداد 1397، 07:01 ب‌ظ
بله ظاهراً مشکل اصن از اون فایل نیستش شاید باید جای دیگه ای دنبال مشکل گشت برای این قضیه خروجی این دستورات رو هم بذارین :
cat .profile
cat .bashrc

خروجی cat .bash_profile (البته فکر کنم به اشتباه cat .profile نوشته شده بود):
#
# ~/.bash_profile
#

if [ -f ~/.bashrc ]; then
source . ~/.bashrc
fi

و خروجی cat .bashrc:
#
# ~/.bashrc
#

# If not running interactively, don't do anything
[[ $- != *i* ]] && return

#Purple:
PS1='\[\033[1;35m\] \w\[\033[1;31m\] ►►►\[\033[0m\] '

#force_color_prompt=yes

pacman -Q | wc -l
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: علی رزم دیده در 25 خرداد 1397، 07:09 ب‌ظ
خروجی cat .bash_profile (البته فکر کنم به اشتباه cat .profile نوشته شده بود):
نه ما هم  ~/.bash_profile داریم هم .profile ولی سلسله مراتب این طوری هستش که اگه ~/.bash_profile یا ~/.bash_login وجود داشته باشه ~/.profile خونده نمی شه.
بگذریم ... از اون خروجی source مشخصه که مشکل از bash_completion هستش. ولی چیزی که خیلی عجیبه اینه که من هر چی تست می کنم مشکلی با این فایل ندارم ! شاید به خاطر نسخه ی پکیج ها و ... باشه.


متنی که بالاتر لینکش رو گذاشتم برای قبل از reinstall هست.
اینم لینک متن فایل بعد از reinstall هست: https://paste.ubuntu.ir/aktd
من با diff یه چکی انجام دادم و هر دو فایل یکسان بودن.

برای اینکه به مشکل نزدیک تر بشیم شما این محتویات رو توی یک فایل بریزین :
#!/bin/bash
_upvar()
{
    if unset -v "$1"; then           # Unset & validate varname
        if (( $# == 2 )); then
            eval $1=\"\$2\"          # Return single value
        else
            eval $1=\(\"\${@:2}\"\)  # Return array
        fi
    fi
}

و بعدش اول دسترسی اجرایی بدین و اجراش کنین :
chmod +x src
./src
source src

این بلوک برای من خطایی نداشت می خوام ببینم برای شما خطا می ده یا نه
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: nino در 25 خرداد 1397، 07:22 ب‌ظ
نه ما هم  ~/.bash_profile داریم هم .profile ولی سلسله مراتب این طوری هستش که اگه ~/.bash_profile یا ~/.bash_login وجود داشته باشه ~/.profile خونده نمی شه.
البته من دستور cat .profile رو هم اجرا کردم ولی پیغام داد که چنین فایلی وجود نداره.

برای اینکه به مشکل نزدیک تر بشیم شما این محتویات رو توی یک فایل بریزین :
#!/bin/bash
_upvar()
{
    if unset -v "$1"; then           # Unset & validate varname
        if (( $# == 2 )); then
            eval $1=\"\$2\"          # Return single value
        else
            eval $1=\(\"\${@:2}\"\)  # Return array
        fi
    fi
}

و بعدش اول دسترسی اجرایی بدین و اجراش کنین :
chmod +x src
./src
source src

این بلوک برای من خطایی نداشت می خوام ببینم برای شما خطا می ده یا نه
طبق دستورات، اسکریپت رو اجرا کردم. دستور ./src در جواب هیچ پیغامی نداد.
اما دستور source src این پیغام رو میده:
bash: ./src: line 11: syntax error near unexpected token `}'
bash: ./src: line 11: `}'
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: علی رزم دیده در 25 خرداد 1397، 09:09 ب‌ظ
شرمنده یه مشکلی پیش اومد مجبور شدم یه لحظه برم ...


البته من دستور cat .profile رو هم اجرا کردم ولی پیغام داد که چنین فایلی وجود نداره.
بله حضور این فایل (مثل bash_profile) اجباری نیست و برای مثال من هم bash_profile رو ندارم ولی بش هر دوی اونا رو (البته با اون سلسله مراتبی که گفتم) می خونه.


bash: ./src: line 11: syntax error near unexpected token `}'
bash: ./src: line 11: `}'
اینکه چرا این سینتکس برای source شما داره خطا می ده واقعاً عجیبه ولی یه حدسی در این مورد دارم ...
برای چک کردن حدسم یه فایل به اسم src ایجاد کنین و محتویات زیر رو توی اون قرار بدین :
#!/bin/bash
_upvar()
{
 echo $PATH
}
_upvar
حالا با دستور زیر اونو سورس کنین :
source src
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: nino در 25 خرداد 1397، 09:20 ب‌ظ
شرمنده یه مشکلی پیش اومد مجبور شدم یه لحظه برم ...
اختیار دارید ...

برای چک کردن حدسم یه فایل به اسم src ایجاد کنین و محتویات زیر رو توی اون قرار بدین :
#!/bin/bash
_upvar()
{
 echo $PATH
}
_upvar
حالا با دستور زیر اونو سورس کنین :
source src
خروجی:
/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
این فایل src که فرمودید باید در مسیر خاصی ساخته بشه یا فقط برای تسته؟
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: علی رزم دیده در 25 خرداد 1397، 10:48 ب‌ظ
نه فقط برای تست هستش.

والا من فعلاً که چیز خاصی به ذهنم نمی رسه ولی شما خروجی این دستور رو هم بذارین :
echo $BASH_VERSION
echo $BASH_COMPLETION_VERSINFO
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: nino در 25 خرداد 1397، 11:03 ب‌ظ
والا من فعلاً که چیز خاصی به ذهنم نمی رسه ولی شما خروجی این دستور رو هم بذارین :
echo $BASH_VERSION
echo $BASH_COMPLETION_VERSINFO
خروجی هاشون به ترتیب اینه:
4.4.23(1)-release
2

در یکی از وبسایت ها نوشته بود که در فایل bash_completion، عبارت (1) باید با (2) جایگزین بشه اما در پرانتز گفته بود که انجام این کار پیشنهاد نمی شه:
(1) [[ ${!2} == \$* ]] && eval $2=${!2}
(2) [[ ${!2} == \$\'* ]] && eval $2=${!2}
نظر شما چیه؟
(نشانی وبسایت: https://unix.stackexchange.com/questions/164231/how-to-fix-corrupted-bash-completion-in-command-substitution)
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: علی رزم دیده در 25 خرداد 1397، 11:16 ب‌ظ
واقعاً عجیبه چون نسخه ی بش من هم دقیقاً همون نسخه هستش.

در یکی از وبسایت ها نوشته بود که در فایل bash_completion، عبارت (1) باید با (2) جایگزین بشه اما در پرانتز گفته بود که انجام این کار پیشنهاد نمی شه:
(1) [[ ${!2} == \$* ]] && eval $2=${!2}
(2) [[ ${!2} == \$\'* ]] && eval $2=${!2}
نظر شما چیه؟
(نشانی وبسایت: https://unix.stackexchange.com/questions/164231/how-to-fix-corrupted-bash-completion-in-command-substitution)
والا مشکل شما با اون فرق داره مشکل شما توی این بلوک هستش :
#!/bin/bash
_upvar()
{
    if unset -v "$1"; then           # Unset & validate varname
        if (( $# == 2 )); then
            eval $1=\"\$2\"          # Return single value
        else
            eval $1=\(\"\${@:2}\"\)  # Return array
        fi
    fi
}
که وقتی با source تست کردین خطا دادش ولی توی این قسمت ما چیزی به شکل [[ ${!2} == \$* ]] && eval $2=${!2} نداریم.

علاوه بر این الان من با اون فایل هیچ مشکلی ندارم و دقیقاً با همون خطوط هیچ خطایی دریافت نمی کنم و راحت source می گیرم.
با توجه به اینکه نسخه ی bash ما هم با هم دیگه یکی هستش تنها موردی که به ذهنم می رسه env ها هستش. شاید چیزی ست شده که باعث این مشکل می شه.

به عنوان تیر آخر خروجی این دستور رو هم بذارین:
env
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: nino در 25 خرداد 1397، 11:22 ب‌ظ
با توجه به اینکه نسخه ی bash ما هم با هم دیگه یکی هستش تنها موردی که به ذهنم می رسه env ها هستش. شاید چیزی ست شده که باعث این مشکل می شه.

به عنوان تیر آخر خروجی این دستور رو هم بذارین:
env

شما از چه توزیع و نسخه ای استفاده می کنید؟

اینم به عنوان تیر آخر  [-o<
خروجی env:
LANG=en_US.UTF-8
DISPLAY=:0
GTK_OVERLAY_SCROLLING=0
COLORTERM=truecolor
DESKTOP_AUTOSTART_ID=106259f7ba9703f705152906787264940200000007170034
MOZ_PLUGIN_PATH=/usr/lib/mozilla/plugins
XDG_VTNR=7
XDG_SESSION_ID=c2
XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/nino
USER=nino
DESKTOP_SESSION=cinnamon
GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/20bbd4ca_3a59_442a_b8b6_050893bff6e2
PWD=/home/nino
HOME=/home/nino
XDG_SESSION_TYPE=x11
XDG_SESSION_DESKTOP=cinnamon
GTK_MODULES=canberra-gtk-module
MAIL=/var/spool/mail/nino
TERM=xterm-256color
SHELL=/bin/bash
VTE_VERSION=5202
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
XDG_CURRENT_DESKTOP=X-Cinnamon
GNOME_TERMINAL_SERVICE=:1.76512
XDG_SEAT=seat0
SHLVL=1
GDMSESSION=cinnamon
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
LOGNAME=nino
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
XDG_RUNTIME_DIR=/run/user/1000
XAUTHORITY=/home/nino/.Xauthority
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
SESSION_MANAGER=local/arch:@/tmp/.ICE-unix/717,unix/arch:/tmp/.ICE-unix/717
_=/usr/bin/env
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: علی رزم دیده در 25 خرداد 1397، 11:51 ب‌ظ
توزیع من دبیان sid هستش ولی من اون بلوک رو توی ماشین مجازی روی آرچ هم تست کردم و باز هم خطایی دریافت نکردم.
دقیق با همون خروجی env و path و نسخه ی bash و ...

من چیز خاصی فعلاً به ذهنم نمی رسه بازم صبر کنین بچه ها کمکتون می کنن. منم اگه چیز خاصی به ذهنم رسید ارسال می کنم.
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: علی رزم دیده در 25 خرداد 1397، 11:57 ب‌ظ
لطفاً خروجی این رو هم اضافه کنین :
cat -net /usr/share/bash-completion/bash_completion | head -n 173تا تمام کارکتر هایی که وجود دارن به نمایش دربیان. شاید قبل یا بعد { یه کارکتر تبی چیزی باشه به نمایش در میاد.
عنوان: پاسخ : خطای syntax error در ترمینال
ارسال شده توسط: nino در 26 خرداد 1397، 12:05 ق‌ظ
لطفاً خروجی این رو هم اضافه کنین :
cat -net /usr/share/bash-completion/bash_completion | head -n 173تا تمام کارکتر هایی که وجود دارن به نمایش دربیان. شاید قبل یا بعد { یه کارکتر تبی چیزی باشه به نمایش در میاد.
خروجی:
     1 #                                                          -*- shell-script -*-$
     2 #$
     3 #   bash_completion - programmable completion functions for bash 4.1+$
     4 #$
     5 #   Copyright M-BM-) 2006-2008, Ian Macdonald <ian@caliban.org>$
     6 #             M-BM-) 2009-2018, Bash Completion Maintainers$
     7 #$
     8 #   This program is free software; you can redistribute it and/or modify$
     9 #   it under the terms of the GNU General Public License as published by$
    10 #   the Free Software Foundation; either version 2, or (at your option)$
    11 #   any later version.$
    12 #$
    13 #   This program is distributed in the hope that it will be useful,$
    14 #   but WITHOUT ANY WARRANTY; without even the implied warranty of$
    15 #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the$
    16 #   GNU General Public License for more details.$
    17 #$
    18 #   You should have received a copy of the GNU General Public License$
    19 #   along with this program; if not, write to the Free Software Foundation,$
    20 #   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.$
    21 #$
    22 #   The latest version of this software can be obtained here:$
    23 #$
    24 #   https://github.com/scop/bash-completion$
    25 $
    26 BASH_COMPLETION_VERSINFO=(2 8)$
    27 $
    28 if [[ $- == *v* ]]; then$
    29     BASH_COMPLETION_ORIGINAL_V_VALUE="-v"$
    30 else$
    31     BASH_COMPLETION_ORIGINAL_V_VALUE="+v"$
    32 fi$
    33 $
    34 if [[ ${BASH_COMPLETION_DEBUG-} ]]; then$
    35     set -v$
    36 else$
    37     set +v$
    38 fi$
    39 $
    40 # Blacklisted completions, causing problems with our code.$
    41 #$
    42 _blacklist_glob='@(acroread.sh)'$
    43 $
    44 # Turn on extended globbing and programmable completion$
    45 shopt -s extglob progcomp$
    46 $
    47 # A lot of the following one-liners were taken directly from the$
    48 # completion examples provided with the bash 2.04 source distribution$
    49 $
    50 # start of section containing compspecs that can be handled within bash$
    51 $
    52 # user commands see only users$
    53 complete -u groups slay w sux$
    54 $
    55 # bg completes with stopped jobs$
    56 complete -A stopped -P '"%' -S '"' bg$
    57 $
    58 # other job commands$
    59 complete -j -P '"%' -S '"' fg jobs disown$
    60 $
    61 # readonly and unset complete with shell variables$
    62 complete -v readonly unset$
    63 $
    64 # set completes with set options$
    65 complete -A setopt set$
    66 $
    67 # shopt completes with shopt options$
    68 complete -A shopt shopt$
    69 $
    70 # helptopics$
    71 complete -A helptopic help$
    72 $
    73 # unalias completes with aliases$
    74 complete -a unalias$
    75 $
    76 # type and which complete on commands$
    77 complete -c command type which$
    78 $
    79 # builtin completes on builtins$
    80 complete -b builtin$
    81 $
    82 # start of section containing completion functions called by other functions$
    83 $
    84 # Check if we're running on the given userland$
    85 # @param $1 userland to check for$
    86 _userland()$
    87 {$
    88     local userland=$( uname -s )$
    89     [[ $userland == @(Linux|GNU/*) ]] && userland=GNU$
    90     [[ $userland == $1 ]]$
    91 }$
    92 $
    93 # This function sets correct SysV init directories$
    94 #$
    95 _sysvdirs()$
    96 {$
    97     sysvdirs=( )$
    98     [[ -d /etc/rc.d/init.d ]] && sysvdirs+=( /etc/rc.d/init.d )$
    99     [[ -d /etc/init.d ]] && sysvdirs+=( /etc/init.d )$
   100     # Slackware uses /etc/rc.d$
   101     [[ -f /etc/slackware-version ]] && sysvdirs=( /etc/rc.d )$
   102 }$
   103 $
   104 # This function checks whether we have a given program on the system.$
   105 #$
   106 _have()$
   107 {$
   108     # Completions for system administrator commands are installed as well in$
   109     # case completion is attempted via `sudo command ...'.$
   110     PATH=$PATH:/usr/sbin:/sbin:/usr/local/sbin type $1 &>/dev/null$
   111 }$
   112 $
   113 # Backwards compatibility for compat completions that use have().$
   114 # @deprecated should no longer be used; generally not needed with dynamically$
   115 #             loaded completions, and _have is suitable for runtime use.$
   116 have()$
   117 {$
   118     unset -v have$
   119     _have $1 && have=yes$
   120 }$
   121 $
   122 # This function checks whether a given readline variable$
   123 # is `on'.$
   124 #$
   125 _rl_enabled()$
   126 {$
   127     [[ "$( bind -v )" == *$1+([[:space:]])on* ]]$
   128 }$
   129 $
   130 # This function shell-quotes the argument$
   131 quote()$
   132 {$
   133     local quoted=${1//\'/\'\\\'\'}$
   134     printf "'%s'" "$quoted"$
   135 }$
   136 $
   137 # @see _quote_readline_by_ref()$
   138 quote_readline()$
   139 {$
   140     local quoted$
   141     _quote_readline_by_ref "$1" ret$
   142     printf %s "$ret"$
   143 } # quote_readline()$
   144 $
   145 $
   146 # This function shell-dequotes the argument$
   147 dequote()$
   148 {$
   149     eval printf %s "$1" 2> /dev/null$
   150 }$
   151 $
   152 $
   153 # Assign variable one scope above the caller$
   154 # Usage: local "$1" && _upvar $1 "value(s)"$
   155 # Param: $1  Variable name to assign value to$
   156 # Param: $*  Value(s) to assign.  If multiple values, an array is$
   157 #            assigned, otherwise a single value is assigned.$
   158 # NOTE: For assigning multiple variables, use '_upvars'.  Do NOT$
   159 #       use multiple '_upvar' calls, since one '_upvar' call might$
   160 #       reassign a variable to be used by another '_upvar' call.$
   161 # See: http://fvue.nl/wiki/Bash:_Passing_variables_by_reference$
   162 _upvar()$
   163 {$
   164     if unset -v "$1"; then           # Unset & validate varname$
   165         if (( $# == 2 )); then$
   166             eval $1=\"\$2\"          # Return single value$
   167         else$
   168             eval $1=\(\"\${@:2}\"\)  # Return array$
   169         fi$
   170     fi$
   171 }$
   172 $
   173 $