bashはprintを同じ行に表示する

bashはprintを同じ行に表示する

パッケージ ディレクトリを取得する関数を呼び出す bash スクリプトがあります。
呼び出された関数 (_ros_package_find) をデバッグしようとしており、いくつかの echo ステートメントを追加しました。

pkgdir=`_ros_package_find $1`
echo 'debug rosbash first $pkgdir', $pkgdir


function _ros_package_find {
    echo 'debug rospackage find', $1
    local loc
    loc=`export ROS_CACHE_TIMEOUT=-1.0 && rospack find $1 2> /dev/null`
    echo 'loc', $?
    if [[ $? != 0 ]]; then
        return 1
    fi
    echo $loc
    return 0
}

最終的な表示は次のようになります -

debug rosbash first $pkgdir, debug rospackage find, roscpp_tutorials loc, 0 /opt/ros/lunar/share/roscpp_tutorials

'debug rospackage find' が、最後の echo ステートメントの echo ステートメント内に表示されるのに、独自の行内に表示されるのはなぜかわかりません。

答え1

スクリプトにいくつかの変更を加えると、改善される可能性があります (下記のスクリプトの更新バージョンを参照してください)。

Q: 「debug rospackage find」が、最後の echo ステートメントの echo ステートメント内に表示されるのはなぜですか。

A: 次の行の出力:

echo 'debug rosbash first $pkgdir', $pkgdir

次のようになります:

テキスト「debug rosbash first $pkgdir」の後にコマンドの結果が続きます$pkgdir_ros_package_find

tempvar以下の例では、変数にコマンドの実行結果が保持されていることがわかります。ls実行時にはecho "debug debug", $tempvar、結果が 1 行取得されます。

$ ls
123  234  345
$ tempvar=$(ls)
$ echo "debug debug", $tempvar
debug debug, 123 234 345

たとえば以下のように2 つ実行するとecho commands、2 行の出力が得られます。

$ echo "debug debug"; echo $tempvar
debug debug
123 234 345

スクリプトの修正バージョン:

#!/bin/bash
pkgdir=$(_ros_package_find "$1")
echo "debug rosbash first $pkgdir", "$pkgdir"

function _ros_package_find {
    echo 'debug rospackage find', "$1"
    local loc
    loc=$(export ROS_CACHE_TIMEOUT=-1.0 && rospack find "$1" 2> /dev/null)
    echo 'loc', $?
    if [[ $? != 0 ]]; then
        return 1
    fi
    echo "$loc"
    return 0
}

関連情報